Байтовый массив в короткий массив и обратно в java
У меня возникли некоторые проблемы с получением аудиоданных, хранящихся в массиве байтов, преобразованием их в короткий конец большого массива, его кодировкой, а затем его заменой в массив байтов. Вот что у меня есть. Исходные аудиоданные хранятся в audioBytes2. Я использую тот же формат для декодирования с минусом функции cos. К сожалению, изменение байтов и коротких типов данных не подлежит обсуждению.
short[] audioData = null;
int nlengthInSamples = audioBytes2.length / 2;
audioData = new short[nlengthInSamples];
for (int i = 0; i < nlengthInSamples; i++) {
short MSB = (short) audioBytes2[2*i+1];
short LSB = (short) audioBytes2[2*i];
audioData[i] = (short) (MSB << 8 | (255 & LSB));
}
int i = 0;
while (i < audioData.length) {
audioData[i] = (short)(audioData[i] + (short)5*Math.cos(2*Math.PI*i/(((Number)EncodeBox.getValue()).intValue())));
i++;
}
short x = 0;
i = 0;
while (i < audioData.length) {
x = audioData[i];
audioBytes2[2*i+1] = (byte)(x >>> 0);
audioBytes2[2*i] = (byte)(x >>> 8);
i++;
}
Я сделал все, что мог придумать, чтобы сделать эту работу, но ближайший я пришел, чтобы заставить его работать с каждым другим кодированием/декодированием, и я понятия не имею, почему. Спасибо за любую помощь.
Ответы
Ответ 1
Я также предлагаю вам попробовать ByteBuffer.
byte[] bytes = {};
short[] shorts = new short[bytes.length/2];
// to turn bytes to shorts as either big endian or little endian.
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
// to turn shorts back to bytes.
byte[] bytes2 = new byte[shortsA.length * 2];
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortsA);
Ответ 2
public short bytesToShort(byte[] bytes) {
return ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
}
public byte[] shortToBytes(short value) {
return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(value).array();
}
Ответ 3
Как насчет некоторых ByteBuffers?
byte[] payload = new byte[]{0x7F,0x1B,0x10,0x11};
ByteBuffer bb = ByteBuffer.wrap(payload).order(ByteOrder.BIG_ENDIAN);
ShortBuffer sb = bb.asShortBuffer();
while(sb.hasRemaining()){
System.out.println(sb.get());
}
Ответ 4
Ваш код делает короткошерстные шорты, а не большие. У вас индексирование для MSB и LSB заменено.
Поскольку вы используете широкоформатные шорты, вы можете использовать DataInputStream, обернутый вокруг ByteArrayInputStream (и DataOutputStream/ByteArrayOutputStream) на другом конце, вместо того, чтобы делать свое собственное декодирование.
Если вы работаете с каждым другим декодером, я бы предположил, что у вас есть нечетное количество байтов или ошибка в отдельности, которая заставляет вашу ошибку фиксироваться на каждом проходе.
Наконец, я бы прошел через массив с я + = 2 и использовал MSB = arr [i] и LSB = arr [i + 1] вместо того, чтобы умножать на 2, но это только я.
Ответ 5
byte [2] bytes;
int r = bytes [1] и 0xFF;
r = (r < 8) | (байты [0] и 0xFF);
short s = (short) r;
Ответ 6
Похоже, вы меняете порядок байтов между чтением байтов и записью их обратно (неуверенность в том, что это намеренно или нет).