0

我有一个 UDP 数据包进来,其中包含 Sint64 形式的 UTC。如何将其转换为 UTC 时间?

Sint64 = 8 bytes 我在下面分配了 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

    }
4

2 回答 2

1

首先,您需要将字节数组转换为long(64位有符号整数):

ByteBuffer buf = ByteBuffer.wrap(receiveData);
long utcTime = buf.getLong();

此代码假定 64 位值以处理器用于运行应用程序的相同字节顺序(小端与大端)存储。

您没有指定 64 位值到底是什么。我假设它是自 1970 年 1 月 1 日 0:00 UTC 以来的毫秒数。

因此,要构建日期,请使用以下代码:

Date dateTime = new Date(utcTime);

如果您有不同的零点或不同的单位,则需要相应地进行调整。

于 2012-12-28T19:00:55.757 回答
-1

UDP 使用网络字节顺序,即 Big Endian。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)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));

应该可以解决问题(从缓冲区/流中读取 Big Endian)。

于 2012-12-28T21:15:15.083 回答