| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- package com.chinaitop.depot.intelligent.socket;
- import com.alibaba.fastjson.JSON;
- import com.chinaitop.depot.intelligent.grainsituation.service.GasDetectionService;
- import com.google.common.collect.Lists;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import javax.annotation.Resource;
- import java.io.*;
- import java.net.Socket;
- import java.text.NumberFormat;
- import java.util.*;
- /**
- * @author qingsong.han
- * @description: 多线程socket连接客户端
- * @create 2021-10-11 13:14
- */
- public class ServerThread implements Runnable {
- private final static Logger log = LoggerFactory.getLogger(ServerThread.class);
- private Socket socket;
- @Resource
- private GasDetectionService gasDetectionService;
- ServerThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- InputStream inputStream = null; // 字节输入流
- try {
- synchronized (this) {
- inputStream = socket.getInputStream();
- int read; // 读取数据变量
- // 缓存返回数据
- Integer[] data = null; // 动态扩容数组初始化
- // 获取5983次实时数据,初始化
- int count = 0;
- // 获取数据次数位 117位*51+16 为一组数据
- int whileCount = 0X175F;
- //循环读取客户端信息
- while (true) {
- count++;
- // 读取十进制数据
- read = inputStream.read();
- //获取客户端的ip地址及发送数据
- // System.out.println("服务器端接收:" + "{'from_client':'" + socket.getInetAddress().getHostAddress() + "','data':'" + read + "'}");
- // System.out.println("服务器端接收:" + read);
- // 动态扩容数组
- if (data == null) { //若数组为空,定义数组的长度为1
- data = new Integer[1];
- data[0] = read;
- } else {
- //把新数组给原先这个数组(若数组不为空,把数组复制出一个新的,在原数组的基础上加1)
- data = Arrays.copyOf(data, data.length + 1);
- data[data.length - 1] = read;
- }
- // TODO 判断检测是否结束(排空气体位置第69位,不准改用次数)
- if (count == whileCount) {
- break;
- }
- }
- log.info("监听到的测气PLC返回源数据: {}", JSON.toJSON(data));
- // TODO 数据处理并保存到数据库
- // 1.将数据前16位排除
- // 2.将数据分成51组,每组117个位
- // 3.将十进制转换成二进制
- // 4.将没4个位的二进制拼接成一组数据
- // 5.将排好的二进制转换成浮点数(float),并对应通道
- /*
- * 氧气实时 70-74
- * 磷化氢实时 74-77
- * 南检测结果 氧气 78-81
- * 南检测结果 磷化氢 82-85
- * 东检测结果 氧气 86-89
- * 东检测结果 磷化氢 90-93
- * 北检测结果 氧气 94-97
- * 北检测结果 磷化氢 98-101
- * 西检测结果 氧气 102-105
- * 西检测结果 磷化氢 106-109
- * 中检测结果 氧气 110-113
- * 中检测结果 磷化氢 114-117
- */
- gasDataHandle(data, socket.getInetAddress().getHostAddress()); // 处理数据
- socket.shutdownInput(); // 关闭输入流
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭资源
- try {
- if (inputStream != null) {
- inputStream.close();
- }
- if (socket != null) {
- socket.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- private void gasDataHandle(Integer[] data, String ip) {
- // 1.将数据前16位排除
- Integer[] integers = Arrays.copyOfRange(data, 16, data.length);
- // 2.将数据分成51组,每组117个位
- int bitFromData = 0;
- int bitToData = 117;
- Integer[] groupData;
- List<Integer[]> list = new ArrayList<>();
- for (int i = 0; i < integers.length; i++) {
- if (i % 116 == 0 && bitToData <= integers.length) {
- groupData = Arrays.copyOfRange(integers, bitFromData, bitToData);
- bitFromData += 117;
- bitToData += 117;
- list.add(groupData);
- }
- }
- // 3.将list的每个数组的第70到末尾每4个位的二进制拼接成一组数据
- ArrayList<String> objects = Lists.newArrayList();
- list.forEach(d -> {
- Integer[] integers1 = Arrays.copyOfRange(d, 69, d.length);
- int onlyData = 1;
- StringBuilder builder = new StringBuilder();
- for (Integer integer : integers1) {
- // 4.将十进制转换成二进制
- String string = Integer.toBinaryString(integer);
- if (string.length() < 8) {
- string = String.format("%8d", Integer.parseInt(string)).replace(" ", "0");
- }
- builder.append(string);
- if (onlyData % 4 == 0) {
- builder.append(",");
- }
- onlyData++;
- }
- objects.add(builder.toString());
- // 每4个字符串拼接成一组数据
- });
- // 5.将排好的二进制转换成浮点数(float),并对应通道
- List<List<Float>> objects1 = Lists.newArrayList();
- objects.forEach(os -> {
- String[] split = os.split(",");
- ArrayList<Float> objects2 = Lists.newArrayList();
- for (String s : split) {
- int i = Integer.parseInt(s, 2);
- float v = Float.intBitsToFloat(i);
- // 只保留2位小数,并处理 2.357111E-38 科学计数法
- // 创建一个数值格式化对象
- NumberFormat numberFormat = NumberFormat.getInstance();
- // 设置精确到小数点后2位
- numberFormat.setMaximumFractionDigits(2);
- objects2.add(Float.parseFloat(numberFormat.format(v)));
- }
- // 多通道数据保存,暂时使用实时数据求51组数据的平均值
- objects1.add(objects2);
- });
- log.info("处理后的PLC测气返回数据: {}", JSON.toJSON(objects1));
- // 将数据保存到数据库
- gasDetectionService.saveGasData(objects1, ip);
- }
- /*public static void main(String[] args) {
- // 测试数据
- Integer[] data = {1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 71, 174, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 102, 102, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 102, 102, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 76, 205, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 153, 154, 67, 99, 51, 51, 67, 99, 230, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 179, 51, 67, 99, 76, 205, 67, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 92, 41, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 76, 205, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 76, 205, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 230, 102, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 230, 102, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 174, 20, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 230, 102, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 99, 204, 205, 67, 99, 102, 102, 67, 100, 25, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 215, 10, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 174, 20, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 100, 0, 0, 67, 99, 153, 154, 67, 100, 76, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 100, 0, 0, 67, 99, 153, 154, 67, 100, 76, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 100, 25, 154, 67, 99, 153, 154, 67, 100, 76, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 100, 25, 154, 67, 99, 153, 154, 67, 100, 76, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 71, 204, 205, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 200, 0, 0, 0, 0, 0, 65, 165, 153, 154, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 65, 165, 153, 154, 0, 0, 0, 0, 1, 0, 85, 85, 67, 100, 0, 0, 67, 99, 153, 154, 67, 100, 76, 205};
- // 1.将数据前16位排除
- Integer[] integers = Arrays.copyOfRange(data, 16, data.length);
- // 2.将数据分成51组,每组117个位
- int bitFromData = 0;
- int bitToData = 117;
- Integer[] groupData;
- List<Integer[]> list = new ArrayList<>();
- for (int i = 0; i < integers.length; i++) {
- if (i % 116 == 0 && bitToData <= integers.length) {
- groupData = Arrays.copyOfRange(integers, bitFromData, bitToData);
- bitFromData += 117;
- bitToData += 117;
- list.add(groupData);
- }
- }
- // 3.将list的每个数组的第70到末尾每4个位的二进制拼接成一组数据
- ArrayList<String> objects = Lists.newArrayList();
- list.forEach(d -> {
- Integer[] integers1 = Arrays.copyOfRange(d, 69, d.length);
- int onlyData = 1;
- StringBuilder builder = new StringBuilder();
- for (Integer integer : integers1) {
- // 4.将十进制转换成二进制
- String string = Integer.toBinaryString(integer);
- if (string.length() < 8) {
- string = String.format("%8d", Integer.parseInt(string)).replace(" ", "0");
- }
- builder.append(string);
- if (onlyData % 4 == 0) {
- builder.append(",");
- }
- onlyData++;
- }
- objects.add(builder.toString());
- // 每4个字符串拼接成一组数据
- });
- // 5.将排好的二进制转换成浮点数(float),并对应通道
- List<List<Float>> objects1 = Lists.newArrayList();
- objects.forEach(os -> {
- String[] split = os.split(",");
- ArrayList<Float> objects2 = Lists.newArrayList();
- for (String s : split) {
- int i = Integer.parseInt(s, 2);
- float v = Float.intBitsToFloat(i);
- // 只保留2位小数,并处理 2.357111E-38 科学计数法
- // 创建一个数值格式化对象
- NumberFormat numberFormat = NumberFormat.getInstance();
- // 设置精确到小数点后2位
- numberFormat.setMaximumFractionDigits(2);
- objects2.add(Float.parseFloat(numberFormat.format(v)));
- }
- // 多通道数据保存,暂时使用实时数据求51组数据的平均值
- objects1.add(objects2);
- });
- System.out.println("objects1--->" + JSON.toJSONString(objects1));
- }*/
- }
|