Aar*_*ron 43 java arrays byte short type-conversion
我有一些问题,将音频数据存储在一个字节数组中,将其转换为大端短数组,对其进行编码,然后将其更改回字节数组.这就是我所拥有的.原始音频数据存储在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++;
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了我能想到的所有工作,但我最接近的是让它每隔一个编码/解码工作,我不知道为什么.谢谢你的帮助.
Pet*_*rey 86
我也建议你试试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);
Run Code Online (Sandbox Code Playgroud)
Sco*_*Izu 10
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();
}
Run Code Online (Sandbox Code Playgroud)
一些ByteBuffer怎么样?
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());
}
Run Code Online (Sandbox Code Playgroud)
byte[2] bytes;
int r = bytes[1] & 0xFF;
r = (r << 8) | (bytes[0] & 0xFF);
short s = (short)r;
Run Code Online (Sandbox Code Playgroud)
小智 2
您的代码正在执行小端短裤,而不是大端。您已经交换了 MSB 和 LSB 的索引。
由于您使用的是 big-endian 短裤,因此您可以在另一端使用包裹在 ByteArrayInputStream(和 DataOutputStream/ByteArrayOutputStream)周围的 DataInputStream,而不是进行自己的解码。
如果您让其他所有解码都正常工作,我猜您的字节数为奇数,或者在其他地方出现了差一错误,这导致您的错误在所有其他传递中得到修复。
最后,我会使用 i+=2 遍历数组并使用 MSB= arr[i] 和 LSB=arr[i+1] 而不是乘以 2,但这只是我的情况。
归档时间: |
|
查看次数: |
44904 次 |
最近记录: |