Как преобразовать числа в byte java?
Вот мой код.
private void sendJoystickData() {
int a = 0xABCD;
int b = (int) Math.floor(direction * 81.92f);
int c = (int) Math.floor(speed * 163.84f);
int d = a ^ b ^ c;
Log.d("BMessage", String.valueOf(b));
Log.d("BMessage", String.valueOf(c));
byte[] bytes = new byte[8];
bytes[0] = (byte) (a);
bytes[1] = (byte) ((a >> 8));
bytes[2] = (byte) b;
bytes[3] = (byte) (b >> 8);
bytes[4] = (byte) c;
bytes[5] = (byte) (c >> 8);
bytes[6] = (byte) d;
bytes[7] = (byte) (d >> 8);
Log.d("BMessage", Arrays.toString(bytes));
// Отправляем сообщение
MessageManager.SendMessage(bytes);
}
Столкнулся с проблемой, что отрицательные данные некорректно переводятся. Если я беру положительное число, то всё хорошо. Однако при отрицательном он выдает странные ответы. Если я беру число -100 и умножаю него на 163.84f, после чего округляю у меня получится -16384. При переводе на 16тиричную это 4000. В выводе я получаю C000 = 49152.
Помогите решить проблему
Ответы (1 шт):
Основная проблема в вашем коде заключается в том, что при преобразовании отрицательных чисел в байты происходит переполнение, и числа интерпретируются неверно.
Когда вы преобразуете отрицательное число в тип byte
, происходит переполнение, потому что byte
имеет знаковый тип и использует 8 бит для представления значений от -128
до 127
. Если значение выходит за пределы этого диапазона, происходит переполнение, и число интерпретируется неверно.
Например, если у вас есть число -100
и вы преобразуете его в byte
, результат будет 156
, потому что -100
в дополнительном коде представляется как 156
.
Попробуйте добавить побитовые операции & 0xFF
. Они будут гарантировать, что только младшие 8 битов каждого числа сохраняются при преобразовании в байт. Это позволит избежать проблем с некорректным преобразованием отрицательных чисел:
private void sendJoystickData() {
int a = 0xABCD;
int b = (int) Math.floor(direction * 81.92f);
int c = (int) Math.floor(speed * 163.84f);
int d = a ^ b ^ c;
Log.d("BMessage", String.valueOf(b));
Log.d("BMessage", String.valueOf(c));
byte[] bytes = new byte[8];
bytes[0] = (byte) (a & 0xFF);
bytes[1] = (byte) ((a >> 8) & 0xFF);
bytes[2] = (byte) (b & 0xFF);
bytes[3] = (byte) ((b >> 8) & 0xFF);
bytes[4] = (byte) (c & 0xFF);
bytes[5] = (byte) ((c >> 8) & 0xFF);
bytes[6] = (byte) (d & 0xFF);
bytes[7] = (byte) ((d >> 8) & 0xFF);
Log.d("BMessage", Arrays.toString(bytes));
// Отправляем сообщение
MessageManager.SendMessage(bytes);
}