我正在创建一个UDP数据包来配置java中的GPS调制解调器。数据包的其中一个部分是电话号码,我收到了以下信息:
电话号码是64位。
字节7 = = 0x00(大端)。
字节4-6 =区号(小端)。
字节0-3 =其他数字(小端)。
到目前为止我做了什么:
电话号码是:123 4567890 我将字节部分转换为十六进制: 123 = 0x00007B 4567890 = 0x0045B352
ByteBuffer UDPConfigModem = ByteBuffer.allocate(8);
byte areaCode1 = (0x00007B >> 8) & 0xFF;
byte areaCode2 = (0x00007B >> 16) & 0xFF;
UDPConfigModem.putInt((byte) 0x0045B352).order(ByteOrder.LITTLE_ENDIAN);
UDPConfigModem.put((byte) areaCode2).order(ByteOrder.LITTLE_ENDIAN);
UDPConfigModem.put((byte) areaCode1).order(ByteOrder.LITTLE_ENDIAN);
UDPConfigModem.put((byte) 0x00007B).order(ByteOrder.LITTLE_ENDIAN);
UDPConfigModem.put((byte) 0x00);
因为其他数字需要4个字节,所以我只使用了putInt并对字节进行了排序,我很确定这不是问题。
区域代码需要3个字节,并且没有我知道的变量,所以我读取了位移并使用How do I convert a 24-bit integer into a 3-byte array?中的逻辑来移位它。这是我相信我的问题所在。
Byte 7非常直接。
如果电话号码发送正确,我应该从调制解调器得到回复,但是当在线鲨上监听时,我看到数据包已发送,但没有回复回复。
我想知道你们是否能看到任何错误或更好的方法来解决这个问题?
感谢。
答案 0 :(得分:1)
您的代码令人困惑。一个字节不是小端或大端。字节序仅适用于表示较大数字的字节序列,例如整数。 .order
ByteBuffer
交换整个缓冲区,这不是您想要的。
putInt((byte) 0x0045B352)
不会起作用 - 你可能只是获得该整数的低位字节。我建议你使用这个答案https://stackoverflow.com/a/4378416/116509并逐个放置字节(没有理由使用强制转换)。