Я работаю над программой Java, в которой мне нужно преобразовать short
в два байта (который затем будет упакован в пакет данных). Я использую ByteBuffer
для выполнения преобразования, и, похоже, он работает, но я вижу некоторые видимые байтовые дополнения, которые я не совсем понимаю.ByteBuffer byte padding в Java
Вот простой пример, который я написал:
import java.lang.*;
import java.io.*;
import java.nio.ByteOrder;
import java.nio.ByteBuffer;
public class Test {
public static void main(String args[]) {
short i = 27015;
String s = Integer.toHexString(i);
System.out.println("i = " + i);
System.out.println("s = " + s);
System.out.println("---");
ByteBuffer b = ByteBuffer.allocate(2);
b.order(ByteOrder.BIG_ENDIAN);
b.putShort(i);
System.out.printf("0x%H\n", b.getShort(0));
System.out.println("---");
byte[] a = b.array();
for(int j = 0; j < a.length; j++)
System.out.printf("a[" + j + "] = 0x%H\n", a[j]);
System.exit(0);
}
}
Эта программа производит следующий вывод:
i = 27015
s = 6987
---
0x6987
---
a[0] = 0x69
a[1] = 0xFFFFFF87
Когда ByteBuffer
превращается в byte
массив, почему второй байт дополняется 0xFF ? Кажется, что второй элемент массива должен быть 0x87
вместо 0xFFFFFF87
. Я что-то упускаю?
Спасибо!
Байт '0x87' отрицательный, имеет свой бит бит. Преобразованный в int другой получает 0xFFFFFF87, отрицательное число. –