Numpy from string (разница uint8 и uint16) [объединение двух значений uint8 в одно значение uint16]

У меня есть аудиофайл на Java, когда я читаю AudioInputStreamи преобразую его в массив байтов, я получаю значения между -128и 127. Мне нужно преобразовать эти значения в диапазон между -32768и 32767. Поэтому я думаю, что мне нужно объединить каждые два значения в моем массиве Java в одно значение.

В Python я могу прочитать файл и преобразовать его в строку с помощью numpy.fromstringфункции. Предположим, я храню uint8значения в A, uint16значения в B.

A[2*i] = -50

A[2*i+1] = 21

B[i] = 5582

У меня есть такие ценности. Каким-то образом я думаю, что мне нужно объединить каждые два значения в A, чтобы иметь возможность иметь B. Как я могу сделать это в Java?

1 ответ

  1. Использовать ByteBuffer:

    byte[] b = { 37, -39, -112, -32, 123, -40, -114, 121 };
    short[] s = new short[b.length / 2];
    ByteBuffer buf = ByteBuffer.wrap(b);
    // buf.order(ByteOrder.LITTLE_ENDIAN);
    for (int i = 0; i < s.length; i++)
        s[i] = buf.getShort();
    System.out.println(Arrays.toString(b));
    System.out.println(Arrays.toString(s));
    

    Выходные данные (big-endian, по умолчанию):

    [37, -39, -112, -32, 123, -40, -114, 121]
    [9689, -28448, 31704, -29063]
    

    Вывод (Lick-endian, путем раскомментирования строки):

    [37, -39, -112, -32, 123, -40, -114, 121]
    [-9947, -8048, -10117, 31118]