PacketDecoderUtils.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package jt809.common.util;
  2. import jt809.packet.JT809BasePacket;
  3. import io.netty.buffer.ByteBuf;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import static jt809.common.util.CommonUtils.PACKET_CACHE;
  7. /**
  8. * @Author: Xiuming Lee
  9. * @Date: 2019/9/22 16:55
  10. * @Version 1.0
  11. * @Describe: 报文解码工具包
  12. */
  13. public class PacketDecoderUtils {
  14. private static Logger log = LoggerFactory.getLogger(PacketDecoderUtils.class);
  15. public static byte[] decoderEscape(ByteBuf buf){
  16. byte[] originalPacket = CommonUtils.getByteArray(buf);
  17. byte[] correctPacket = decoderEscape(originalPacket);
  18. StringBuilder packetInfo = new StringBuilder();
  19. packetInfo.append("原始报文:").append(bytes2HexStr(originalPacket)).append(";转义后的报文:").append(bytes2HexStr(correctPacket));
  20. PACKET_CACHE.put(Thread.currentThread().getName(),packetInfo.toString());
  21. return correctPacket;
  22. }
  23. public static byte[] decoderEscape(byte[] originalPacket){
  24. String dataStr = bytes2FullHexStr(originalPacket);
  25. dataStr = dataStr.replaceAll("0x5a0x01", "0x5b");
  26. dataStr = dataStr.replaceAll("0x5a0x02", "0x5a");
  27. dataStr = dataStr.replaceAll("0x5e0x01", "0x5d");
  28. dataStr = dataStr.replaceAll("0x5e0x02", "0x5e");
  29. byte[] bytes = fullHexStr2Bytes(dataStr);
  30. return bytes;
  31. }
  32. /**
  33. * 数组转换成十六进制字符串,不带0x
  34. * @param array
  35. * @return HexString
  36. */
  37. public static String bytes2HexStr(byte[] array) {
  38. StringBuffer sb = new StringBuffer(array.length);
  39. String sTemp;
  40. for (int i = 0; i < array.length; i++) {
  41. sTemp = Integer.toHexString(0xFF & array[i]);
  42. if (sTemp.length() < 2){
  43. sb.append(0);
  44. }
  45. sb.append(sTemp.toUpperCase());
  46. }
  47. return sb.toString();
  48. }
  49. /**
  50. * 数组转换成带0x的十六进制字符串
  51. * @param array
  52. * @return HexString
  53. */
  54. public static String bytes2FullHexStr(byte[] array) {
  55. StringBuffer sb = new StringBuffer(array.length);
  56. sb.append("0x");
  57. String sTemp;
  58. for (int i = 0; i < array.length; i++) {
  59. sTemp = Integer.toHexString(0xFF & array[i]);
  60. if (sTemp.length() < 2){
  61. sb.append(0);
  62. }
  63. sb.append(sTemp);
  64. if(i < array.length-1){
  65. sb.append("0x");
  66. }
  67. }
  68. return sb.toString().toLowerCase();
  69. }
  70. /**
  71. * 把16进制字符串不带0x的转换成字节数组
  72. * @param hex
  73. * @return byte[]
  74. */
  75. public static byte[] hexStr2Bytes(String hex) {
  76. int len = (hex.length() / 2);
  77. byte[] result = new byte[len];
  78. char[] achar = hex.toCharArray();
  79. for (int i = 0; i < len; i++) {
  80. int pos = i * 2;
  81. result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
  82. }
  83. return result;
  84. }
  85. /**
  86. * 把带0x的16进制字符串转换成字节数组
  87. * @param hex
  88. * @return byte[]
  89. */
  90. public static byte[] fullHexStr2Bytes(String hex){
  91. hex = hex.toLowerCase().replaceAll("0x","").trim().toUpperCase();
  92. return hexStr2Bytes(hex);
  93. }
  94. private static int toByte(char c) {
  95. byte b = (byte) "0123456789ABCDEF".indexOf(c);
  96. return b;
  97. }
  98. /**
  99. * 基础解析,解析数据体之前的内容,公共的。
  100. * @param bytes
  101. * @param packet
  102. */
  103. public static ByteBuf baseDecoder(byte[] bytes, JT809BasePacket packet) throws Exception {
  104. ByteBuf byteBuf = CommonUtils.getByteBuf(bytes);
  105. byteBuf.skipBytes(1);
  106. packet.setMsgLength(byteBuf.readInt());
  107. packet.setMsgSn(byteBuf.readInt());
  108. packet.setMsgId(byteBuf.readShort());
  109. packet.setMsgGNSSCenterId(byteBuf.readInt());
  110. byte[] versionFlag = new byte[3];
  111. byteBuf.readBytes(versionFlag);
  112. packet.setVersionFlag(versionFlag);
  113. packet.setEncryptFlag(byteBuf.readByte());
  114. packet.setEncryptKey(byteBuf.readInt());
  115. return byteBuf;
  116. }
  117. /**
  118. * 获取数据体的 ByteBuf
  119. * @param byteBuf 是从数据体开始的ByteBuf
  120. * @return
  121. */
  122. public static ByteBuf getMsgBodyBuf(ByteBuf byteBuf) {
  123. byte[] msgBodyByteArr = getMsgBodyByteArr(byteBuf);
  124. return CommonUtils.getByteBuf(msgBodyByteArr);
  125. }
  126. /**
  127. * 获取数据体的 ByteArr
  128. * @param byteBuf 是从数据体开始的ByteBuf
  129. * @return
  130. */
  131. public static byte[] getMsgBodyByteArr(ByteBuf byteBuf) {
  132. // 1、获取数据数组
  133. int msgBodyLength = byteBuf.readableBytes()-3;
  134. byte[] msgBodyByteArr = new byte[msgBodyLength];
  135. byteBuf.readBytes(msgBodyByteArr);
  136. return msgBodyByteArr;
  137. }
  138. }