0

Sint64 形式の UTC を保持する UDP パケットが着信しています。これを 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

    }
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 はビッグ エンディアンであるネットワーク バイト オーダーを使用します。x86 はリトル エンディアンを使用するため、上記の bytebuff の例は x86 では失敗します。

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

トリックを行う必要があります(バッファ/ストリームからビッグエンディアンを読み取ります)。

于 2012-12-28T21:15:15.083 に答える