public void routeMessage(byte[] data, int mode) {
logger.debug(mode);
logger.debug(Integer.toBinaryString(mode));
byte[] message = new byte[8];
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
ByteArrayOutputStream baoStream = new ByteArrayOutputStream();
DataOutputStream doStream = new DataOutputStream(baoStream);
try {
doStream.writeInt(mode);
} catch (IOException e) {
logger.debug("Error converting mode from integer to bytes.", e);
return;
}
byte [] bytes = baoStream.toByteArray();
bytes[0] = (byte)((mode >>> 24) & 0x000000ff);
bytes[1] = (byte)((mode >>> 16) & 0x000000ff);
bytes[2] = (byte)((mode >>> 8) & 0x00000ff);
bytes[3] = (byte)(mode & 0x000000ff);
//bytes = byteBuffer.array();
for (byte b : bytes) {
logger.debug(b);
}
for (int i = 0; i < 4; i++) {
//byte tmp = (byte)(mode >> (32 - ((i + 1) * 8)));
message[i] = bytes[i];
logger.debug("mode, " + i + ": " + Integer.toBinaryString(message[i]));
message[i + 4] = data[i];
}
broker.routeMessage(message);
}
モードを 4 バイトに変換して、ソケット経由で別のアプリケーションに送信するさまざまな方法を試しました (コメント付きのコードからわかるように)。127 までの整数でうまく機能し、256 を超える整数でもうまく機能します。署名されている Java 型と関係があると思いますが、機能しないようです。以下は、プログラムが出力するものの例です。
127
1111111
0
0
0
127
mode, 0: 0
mode, 1: 0
mode, 2: 0
mode, 3: 1111111
128
10000000
0
0
0
-128
mode, 0: 0
mode, 1: 0
mode, 2: 0
mode, 3: 11111111111111111111111110000000
211
11010011
0
0
0
-45
mode, 0: 0
mode, 1: 0
mode, 2: 0
mode, 3: 11111111111111111111111111010011
306
100110010
0
0
1
50
mode, 0: 0
mode, 1: 0
mode, 2: 1
mode, 3: 110010
1 バイトが 32 ビットを格納できるようになったのはなぜですか? どうすればこれを修正できますか?