Java DatagramPacket 读取原始数据类型

标签 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);

最佳答案

我使用 long 作为 64 位值。如果它是时间戳,您可能不需要担心溢出,但如果是的话,有办法纠正这个问题。 32 位 int 值在 Java 中就是 int

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

您很可能希望使用具有 native 字节顺序的 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.

关于Java DatagramPacket 读取原始数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20839845/

相关文章:

java - Spring Boot CSRF 在负载均衡器处理时失败

C:按位小端困惑

ios - NEPacketTunnelProvider 嗅探器 iOS

c - Unix 域套接字 : Using datagram communication between one server process and several client processes

java - 需要Java的 "more precise rethrow in exceptions"

java - 读取编码错误的文件。 CP1252 与 UTF-8

java - 带有 JList 条目的对话框或手动输入文本作为单独的选择

c - C语言中的字节序和移位运算符,我做得正确吗?

c#-4.0 - 将字节数组从小端转换为大端,反之亦然

sockets - UDP守护程序的systemd-activate套接字激活