我正在创建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?中的逻辑对其进行移位。我认为这是我的问题所在。

字节7非常简单。

如果正确发送了电话号码,我应该从调制解调器那里得到响应,但是当在有线鲨鱼上监视它时,我看到了数据包已发送但没有响应被发送回。

我想知道你们是否可以看到任何错误或更好的方法来解决这个问题?

谢谢。

最佳答案

您的代码令人困惑。字节大小不大。字节序仅适用于代表较大数字的字节序列,例如整数。 .order上的ByteBuffer交换不需要的整个缓冲区。

putInt((byte) 0x0045B352)不起作用-您可能只会得到该整数的低字节。我建议您使用此答案https://stackoverflow.com/a/4378416/116509并将字节一一放置(应该没有理由使用强制转换)。

10-05 21:18
查看更多