ServerThread.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package com.chinaitop.depot.intelligent.socket;
  2. import com.alibaba.fastjson.JSON;
  3. import com.chinaitop.depot.intelligent.grainsituation.service.GasDetectionService;
  4. import com.google.common.collect.Lists;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import javax.annotation.Resource;
  8. import java.io.*;
  9. import java.net.Socket;
  10. import java.text.NumberFormat;
  11. import java.util.*;
  12. /**
  13. * @author qingsong.han
  14. * @description: 多线程socket连接客户端
  15. * @create 2021-10-11 13:14
  16. */
  17. public class ServerThread implements Runnable {
  18. private final static Logger log = LoggerFactory.getLogger(ServerThread.class);
  19. private Socket socket;
  20. @Resource
  21. private GasDetectionService gasDetectionService;
  22. ServerThread(Socket socket) {
  23. this.socket = socket;
  24. }
  25. @Override
  26. public void run() {
  27. InputStream inputStream = null; // 字节输入流
  28. try {
  29. synchronized (this) {
  30. inputStream = socket.getInputStream();
  31. int read; // 读取数据变量
  32. // 缓存返回数据
  33. Integer[] data = null; // 动态扩容数组初始化
  34. // 获取5983次实时数据,初始化
  35. int count = 0;
  36. // 获取数据次数位 117位*51+16 为一组数据
  37. int whileCount = 0X175F;
  38. //循环读取客户端信息
  39. while (true) {
  40. count++;
  41. // 读取十进制数据
  42. read = inputStream.read();
  43. //获取客户端的ip地址及发送数据
  44. // System.out.println("服务器端接收:" + "{'from_client':'" + socket.getInetAddress().getHostAddress() + "','data':'" + read + "'}");
  45. // System.out.println("服务器端接收:" + read);
  46. // 动态扩容数组
  47. if (data == null) { //若数组为空,定义数组的长度为1
  48. data = new Integer[1];
  49. data[0] = read;
  50. } else {
  51. //把新数组给原先这个数组(若数组不为空,把数组复制出一个新的,在原数组的基础上加1)
  52. data = Arrays.copyOf(data, data.length + 1);
  53. data[data.length - 1] = read;
  54. }
  55. // TODO 判断检测是否结束(排空气体位置第69位,不准改用次数)
  56. if (count == whileCount) {
  57. break;
  58. }
  59. }
  60. log.info("监听到的测气PLC返回源数据: {}", JSON.toJSON(data));
  61. // TODO 数据处理并保存到数据库
  62. // 1.将数据前16位排除
  63. // 2.将数据分成51组,每组117个位
  64. // 3.将十进制转换成二进制
  65. // 4.将没4个位的二进制拼接成一组数据
  66. // 5.将排好的二进制转换成浮点数(float),并对应通道
  67. /*
  68. * 氧气实时 70-74
  69. * 磷化氢实时 74-77
  70. * 南检测结果 氧气 78-81
  71. * 南检测结果 磷化氢 82-85
  72. * 东检测结果 氧气 86-89
  73. * 东检测结果 磷化氢 90-93
  74. * 北检测结果 氧气 94-97
  75. * 北检测结果 磷化氢 98-101
  76. * 西检测结果 氧气 102-105
  77. * 西检测结果 磷化氢 106-109
  78. * 中检测结果 氧气 110-113
  79. * 中检测结果 磷化氢 114-117
  80. */
  81. gasDataHandle(data, socket.getInetAddress().getHostAddress()); // 处理数据
  82. socket.shutdownInput(); // 关闭输入流
  83. }
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. } finally {
  87. //关闭资源
  88. try {
  89. if (inputStream != null) {
  90. inputStream.close();
  91. }
  92. if (socket != null) {
  93. socket.close();
  94. }
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. private void gasDataHandle(Integer[] data, String ip) {
  101. // 1.将数据前16位排除
  102. Integer[] integers = Arrays.copyOfRange(data, 16, data.length);
  103. // 2.将数据分成51组,每组117个位
  104. int bitFromData = 0;
  105. int bitToData = 117;
  106. Integer[] groupData;
  107. List<Integer[]> list = new ArrayList<>();
  108. for (int i = 0; i < integers.length; i++) {
  109. if (i % 116 == 0 && bitToData <= integers.length) {
  110. groupData = Arrays.copyOfRange(integers, bitFromData, bitToData);
  111. bitFromData += 117;
  112. bitToData += 117;
  113. list.add(groupData);
  114. }
  115. }
  116. // 3.将list的每个数组的第70到末尾每4个位的二进制拼接成一组数据
  117. ArrayList<String> objects = Lists.newArrayList();
  118. list.forEach(d -> {
  119. Integer[] integers1 = Arrays.copyOfRange(d, 69, d.length);
  120. int onlyData = 1;
  121. StringBuilder builder = new StringBuilder();
  122. for (Integer integer : integers1) {
  123. // 4.将十进制转换成二进制
  124. String string = Integer.toBinaryString(integer);
  125. if (string.length() < 8) {
  126. string = String.format("%8d", Integer.parseInt(string)).replace(" ", "0");
  127. }
  128. builder.append(string);
  129. if (onlyData % 4 == 0) {
  130. builder.append(",");
  131. }
  132. onlyData++;
  133. }
  134. objects.add(builder.toString());
  135. // 每4个字符串拼接成一组数据
  136. });
  137. // 5.将排好的二进制转换成浮点数(float),并对应通道
  138. List<List<Float>> objects1 = Lists.newArrayList();
  139. objects.forEach(os -> {
  140. String[] split = os.split(",");
  141. ArrayList<Float> objects2 = Lists.newArrayList();
  142. for (String s : split) {
  143. int i = Integer.parseInt(s, 2);
  144. float v = Float.intBitsToFloat(i);
  145. // 只保留2位小数,并处理 2.357111E-38 科学计数法
  146. // 创建一个数值格式化对象
  147. NumberFormat numberFormat = NumberFormat.getInstance();
  148. // 设置精确到小数点后2位
  149. numberFormat.setMaximumFractionDigits(2);
  150. objects2.add(Float.parseFloat(numberFormat.format(v)));
  151. }
  152. // 多通道数据保存,暂时使用实时数据求51组数据的平均值
  153. objects1.add(objects2);
  154. });
  155. log.info("处理后的PLC测气返回数据: {}", JSON.toJSON(objects1));
  156. // 将数据保存到数据库
  157. gasDetectionService.saveGasData(objects1, ip);
  158. }
  159. /*public static void main(String[] args) {
  160. // 测试数据
  161. 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};
  162. // 1.将数据前16位排除
  163. Integer[] integers = Arrays.copyOfRange(data, 16, data.length);
  164. // 2.将数据分成51组,每组117个位
  165. int bitFromData = 0;
  166. int bitToData = 117;
  167. Integer[] groupData;
  168. List<Integer[]> list = new ArrayList<>();
  169. for (int i = 0; i < integers.length; i++) {
  170. if (i % 116 == 0 && bitToData <= integers.length) {
  171. groupData = Arrays.copyOfRange(integers, bitFromData, bitToData);
  172. bitFromData += 117;
  173. bitToData += 117;
  174. list.add(groupData);
  175. }
  176. }
  177. // 3.将list的每个数组的第70到末尾每4个位的二进制拼接成一组数据
  178. ArrayList<String> objects = Lists.newArrayList();
  179. list.forEach(d -> {
  180. Integer[] integers1 = Arrays.copyOfRange(d, 69, d.length);
  181. int onlyData = 1;
  182. StringBuilder builder = new StringBuilder();
  183. for (Integer integer : integers1) {
  184. // 4.将十进制转换成二进制
  185. String string = Integer.toBinaryString(integer);
  186. if (string.length() < 8) {
  187. string = String.format("%8d", Integer.parseInt(string)).replace(" ", "0");
  188. }
  189. builder.append(string);
  190. if (onlyData % 4 == 0) {
  191. builder.append(",");
  192. }
  193. onlyData++;
  194. }
  195. objects.add(builder.toString());
  196. // 每4个字符串拼接成一组数据
  197. });
  198. // 5.将排好的二进制转换成浮点数(float),并对应通道
  199. List<List<Float>> objects1 = Lists.newArrayList();
  200. objects.forEach(os -> {
  201. String[] split = os.split(",");
  202. ArrayList<Float> objects2 = Lists.newArrayList();
  203. for (String s : split) {
  204. int i = Integer.parseInt(s, 2);
  205. float v = Float.intBitsToFloat(i);
  206. // 只保留2位小数,并处理 2.357111E-38 科学计数法
  207. // 创建一个数值格式化对象
  208. NumberFormat numberFormat = NumberFormat.getInstance();
  209. // 设置精确到小数点后2位
  210. numberFormat.setMaximumFractionDigits(2);
  211. objects2.add(Float.parseFloat(numberFormat.format(v)));
  212. }
  213. // 多通道数据保存,暂时使用实时数据求51组数据的平均值
  214. objects1.add(objects2);
  215. });
  216. System.out.println("objects1--->" + JSON.toJSONString(objects1));
  217. }*/
  218. }