Java DatagramPacket读取原始数据类型

时间:2013-12-30 12:43:34

标签: java endianness datagram

我需要从DatagramPacket 2原始数据类型和字节数组中恢复;

我需要获得一个unsigned long long,并将int作为原始数据类型... 当我尝试使用System.arraycopy手动复制每个变量时,它似乎与字节顺序混乱我得不到与发送时相同的值... 另外,我不确定哪种数据类型与Java中的unsigned long long相同...

第一个变量是时间戳,第二个是我应该得到的下一个字节数组的大小......

使用C语言,我设法只使用:

unsigned long long timestamp = 0;
memcpy(&timestamp, packetData, sizeof(unsigned long long));
packetData += sizeof(unsigned long long);
int sizePacket;
memcpy(&sizePacket, packetData, sizeof(int));
packetData += sizeof(int);
char *encodedData = (char*)malloc(sizePacket);
if (encodedData != nil)
   memcpy(encodedData, packetData, sizePacket);

1 个答案:

答案 0 :(得分:1)

我使用long作为64位值。如果是时间戳,您可能不需要担心溢出,但如果您有解决此问题的方法。 Java中的32位int值只是int

System.arraycopy只复制字节,它不知道字节序,也不会改变它。

您最有可能希望将ByteBuffer与本机字节顺序一起使用。你会得到你想要的东西。

DatagramSocket ds = ...
ByteBuffer bb = ByteBuffer.wrap(ds.getData()).order(ByteOrder.nativeOrder());
long timestamp = bb.getLong();
int number = bb.getInt();
// use the bb to read the encoded data.