データの16ビットチェックサムを計算しています。サーバーに送信する必要があり、サーバーで再計算して、提供されたチェックサムと一致させる必要があります。取得しているチェックサム値はintですが、値を送信するためのバイトが2バイトしかないため、メソッドの呼び出し中にキャストint
しています。これは、チェックサム値が32767未満になるまでは正常に機能し、その後は負の値になります。short
shortToBytes
Javaには符号なしプリミティブがないため、許可されている符号付きの最大値を超える値を送信することはできませんshort
。
どうすればこれを行うことができますか?intをshortに変換し、切り捨てやsigned&unsignedintを気にせずにネットワーク経由で送信します。
また、両側でJavaプログラムを実行しています。
private byte[] shortToBytes(short sh) {
byte[] baValue = new byte[2];
ByteBuffer buf = ByteBuffer.wrap(baValue);
return buf.putShort(sh).array();
}
private short bytesToShort(byte[] buf, int offset) {
byte[] baValue = new byte[2];
System.arraycopy(buf, offset, baValue, 0, 2);
return ByteBuffer.wrap(baValue).getShort();
}