Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何在udp数据包中解析来自Sint64的UTC_Java_Bit Manipulation_Utc - Fatal编程技术网

Java如何在udp数据包中解析来自Sint64的UTC

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

我有一个UDP数据包,它以Sint64的形式保存UTC。如何将此转换为UTC时间

Sint64=8字节 我在下面分配了一个8字节数组。这是进入“receivedData”字节数组的唯一内容

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