1

JavaでGPSモデムを構成するためのUDPパケットを作成しています。パケットのセクションの1つは電話番号であり、次の情報が提供されています。

電話番号は64ビットです。

バイト7は=0x00(ビッグエンディアン)です。

バイト4〜6 =市外局番(リトルエンディアン)。

バイト0〜3 =その他の数字(リトルエンディアン)。

私がこれまでにしたこと:

電話番号は:123 4567890バイトセクションを16進数に変換しました:123 = 0x00007B 4567890 = 0x0045B352

    ByteBuffer UDPConfigModem = ByteBuffer.allocate(8);

    byte areaCode1 = (0x00007B >> 8) & 0xFF;
    byte areaCode2 = (0x00007B >> 16) & 0xFF;

    UDPConfigModem.putInt((byte) 0x0045B352).order(ByteOrder.LITTLE_ENDIAN);
    UDPConfigModem.put((byte) areaCode2).order(ByteOrder.LITTLE_ENDIAN);
    UDPConfigModem.put((byte) areaCode1).order(ByteOrder.LITTLE_ENDIAN);
    UDPConfigModem.put((byte) 0x00007B).order(ByteOrder.LITTLE_ENDIAN);     
    UDPConfigModem.put((byte) 0x00);

他の桁には4バイトが必要なので、putIntを使用してバイトを並べ替えただけなので、問題はないと確信しています。

市外局番は3バイトを必要とし、それを持っていることを知っている変数がないので、ビットシフトについて読み、「24ビット整数を3バイト配列に変換するにはどうすればよいですか?」のロジックを使用しました。それをシフトします。これが私の問題だと私が信じているところです。

バイト7は非常に簡単です。

電話番号が正しく送信されれば、モデムから応答が返されるはずですが、wire sharkで監視すると、パケットが送信されているのがわかりますが、応答が返されません。

私はあなたたちがこれについて何かエラーやより良い方法を見ることができるかどうか疑問に思っていましたか?

ありがとう。

4

1 に答える 1

1

あなたのコードは紛らわしいです。バイトはリトル エンディアンでもビッグ エンディアンでもありません。エンディアンは、整数などのより大きな数を表すバイトのシーケンスにのみ適用されます。.orderonByteBufferは、必要ではないバッファ全体をスワップします。

putInt((byte) 0x0045B352)動作しません-おそらくその整数の下位バイトを取得するだけです。この回答https://stackoverflow.com/a/4378416/116509を使用して、バイトを 1 つずつ配置することをお勧めします (キャストを使用する理由はないはずです)。

于 2012-08-14T16:23:07.727 に答える