Как преобразовать числа в 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 шт):

Автор решения: Chaos_Sower

Основная проблема в вашем коде заключается в том, что при преобразовании отрицательных чисел в байты происходит переполнение, и числа интерпретируются неверно.

Когда вы преобразуете отрицательное число в тип 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);
}
→ Ссылка