字节数组为短数组,并在java中再次返回

时间:2011-04-11 18:12:27

标签: java arrays byte type-conversion short

我遇到一些问题,将音频数据存储在字节数组中,将其转换为大端短数组,对其进行编码,然后将其更改回字节数组。这就是我所拥有的。原始音频数据存储在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++;
    }

我已经完成了我能想到的所有工作,但我最接近的是让它在其他所有编码/解码中工作,我不知道为什么。谢谢你的帮助。

6 个答案:

答案 0 :(得分:81)

我还建议你试试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);

答案 1 :(得分:8)

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();
}

答案 2 :(得分:4)

一些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());
}

答案 3 :(得分:1)

你的代码是做小端短裤,不是很大。你已经为MSB和LSB交换了索引。

由于你使用的是big-endian短路,你可能会在另一端使用围绕ByteArrayInputStream(和DataOutputStream / ByteArrayOutputStream)的DataInputStream,而不是自己进行解码。

如果你让所有其他解码工作,我猜你有一个奇数字节,或其他地方的一个一个错误的错误导致你的错误在每一个其他传递上得到修复。 / p>

最后,我使用i + = 2逐步完成数组并使用MSB = arr [i]和LSB = arr [i + 1]而不是乘以2,但这只是我。

答案 4 :(得分:1)

byte[2] bytes;

int r = bytes[1] & 0xFF;
r = (r << 8) | (bytes[0] & 0xFF);

short s = (short)r;

答案 5 :(得分:-1)

看起来你在读取字节之间并将它们写回来之间交换字节顺序(不确定这是否是有意的)。