Java如何在udp数据包中解析来自Sint64的UTC
我有一个UDP数据包,它以Sint64的形式保存UTC。如何将此转换为UTC时间 Sint64=8字节 我在下面分配了一个8字节数组。这是进入“receivedData”字节数组的唯一内容Java如何在udp数据包中解析来自Sint64的UTC,java,bit-manipulation,utc,Java,Bit Manipulation,Utc,我有一个UDP数据包,它以Sint64的形式保存UTC。如何将此转换为UTC时间 Sint64=8字节 我在下面分配了一个8字节数组。这是进入“receivedData”字节数组的唯一内容 DatagramSocket serverSocket = new DatagramSocket(18000); byte[] receiveData = new byte[8]; while (true) { DatagramPacket receivePa
DatagramSocket serverSocket = new DatagramSocket(18000);
byte[] receiveData = new byte[8];
while (true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
//not sure how I should be reading the raw binary data back into UTC object
}
首先,需要将字节数组转换为
long
(64位有符号整数):
此代码假定64位值以处理器用于运行应用程序的相同字节顺序存储(小端与大端)
您没有指定64位的确切值。我假设它是自1970年1月1日0:00 UTC以来的毫秒数
因此,要构造日期,请使用以下代码:
Date dateTime = new Date(utcTime);
如果您有不同的零点或不同的单位,则需要相应地进行调整。UDP使用网络字节顺序,即大端字节顺序。x86使用little endian,因此上面的bytebuff示例将在x86上失败,因为它不知道long来自网络
return (((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
return(((long)readBuffer[0]与您在同一主题上提出的任何其他问题的方式大致相同。例如。这里唯一的区别是数据包中64位值的实际含义(即,它是毫秒计数吗?),以及您拥有的任何文档都应该解释这一点。顺便说一句,如果您描述整个数据包格式,对您来说会更好。然后,有人可以给您一个简单的答案,告诉您如何将任意大小的字节[]
封装在字节缓冲中,并使用getter检索数据。
return (((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
return (((long)in.read() << 56) +
((long)(in.read() & 255) << 48) +
((long)(in.read() & 255) << 40) +
((long)(in.read() & 255) << 32) +
((long)(in.read() & 255) << 24) +
((in.read() & 255) << 16) +
((in.read() & 255) << 8) +
((in.read() & 255) << 0));