数値をバイト配列に変換する必要があります。たとえば、バイト配列に長いを変換するために、私はこの方法を持っている:このJava ByteBufferの動作についての説明はありますか?
public static byte[] longToBytes(long l) {
ByteBuffer buff = ByteBuffer.allocate(8);
buff.order(ByteOrder.BIG_ENDIAN);
buff.putLong(l);
return buff.array();
}
それはとても簡単だ - それを保持できる配列を割り当て、長いを取り、そこにそれを投げます。 l
の値が何であるかにかかわらず、私は8バイトの配列を取得し、処理して意図したとおりに使用することができます。私の場合は、カスタムバイナリ形式を作成し、それをネットワーク経由で送信しています。
このメソッドを773450364の値で呼び出すと、配列[0 0 0 0 46 25 -22 124]
が返されます。
public static Long bytesToLong(byte[] aBytes, int start) {
byte[] b = new byte[8];
b[0] = aBytes[start + 0];
b[1] = aBytes[start + 1];
b[2] = aBytes[start + 2];
b[3] = aBytes[start + 3];
b[4] = aBytes[start + 4];
b[5] = aBytes[start + 5];
b[6] = aBytes[start + 6];
b[7] = aBytes[start + 7];
ByteBuffer buf = ByteBuffer.wrap(b);
return buf.getLong();
}
Iがバックこの方法に他の方法からの配列を渡すと、私は773450364を取得し、正しい:私はまた戻ってその数値にバイト配列を変換するコードを有します。
ここで、このアレイをTCP経由で別のJavaクライアントに送信します。 java.io.InputStream.read()
メソッドのドキュメントでは、ストリームの終わりに達して-1が返されない限り、int
の値が0から255の間で返されると記載されています。しかし、それを使ってバイト配列を生成すると、受信側で負の値を取得し続けます。私はこれがオーバーフロー(255の値はJavaバイトに収まらないので、バイト配列に入れるとオーバーフローして負になります)と関係していると思われます。
これは私の問題につながります。負の数の存在は私に関係している。今、アプリケーションのJava側を開発しています。バイトは-128〜127の間です。もう1つのエンドポイントは、C、C++、Python、Java、C#などがあります。私はいくつかのバイト配列の負の値の存在が処理にどのように影響するかについてはわかりません。 この動作を文書化する以外に、このシステムで作業している自分や将来の開発者、特にJavaで書かれていないエンドポイントで、これを簡単にするにはどうすればよいですか?
'longToBytes'と同じように' getLong() 'を呼び出す前に、ByteBufferのエンディアンを' bytesToLong'メソッドで設定するべきではありませんか?本当にあなたの質問には関係ありません、ちょうど不思議... –
@G_H私はそれを調べてテストする必要があります。私は実際にこれらの方法のどちらも自分で書いておらず、テストケースは欠けています。それを指摘してくれてありがとう。 –