将字节转换为位

时间:2009-06-03 19:14:50

标签: java types byte bitset

我正在使用java。

我有一个字节数组(数组的每个位置都有8位),我需要做的是将数组中的2个值放在一起并得到一个值。

我会试着更好地解释自己;我正在从音频文件中提取音频数据。该数据存储在字节数组中。每个音频样本的大小为16位。如果数组是:

byte [] audioData;

我需要从示例audioData [0]和audioData [1]中获取1个值,以获得1个音频样本。

有谁能解释我怎么做?

提前致谢。

9 个答案:

答案 0 :(得分:7)

我不是Java开发人员所以这可能完全偏离基础,但你考虑使用ByteBuffer吗?

答案 1 :(得分:4)

假设LSB位于数据[0]

int val;

val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);

答案 2 :(得分:1)

如前所述,Java有一些类可以帮助您解决这个问题。您可以使用ByteBuffer包装数组,然后获取IntBuffer视图。

ByteBuffer bb = ByteBuffer.wrap(audioData);
// optional: bb.order(ByteOrder.BIG_ENDIAN) or bb.order(ByteOrder.LITTLE_ENDIAN)
IntBuffer ib = bb.asIntBuffer();
int firstInt = ib.get(0);

答案 3 :(得分:1)

ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();

上述代码的优点是您可以以相同的方式继续阅读其余的“数据”。

只有两个值的简单解决方案可能是:

short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));

这个简单的解决方案提取两个字节,并将它们拼凑在一起,第一个字节是高阶位,第二个字节是低阶位(这被称为Big-Endian;如果你的字节数组包含Little-Endian数据,您将第二个字节移位而不是16位数;对于Little-Endian 32位数,您必须反转所有4个字节的顺序,因为Java的整数遵循Big-Endian排序。)

答案 4 :(得分:1)

更简单的Java方法是将字节数组解析为位JBBP usage

  class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
  final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);

代码将每个字节的已解析位作为8字节放在Parsed类实例的位数组中

答案 5 :(得分:0)

您可以通过逻辑或两个字节一起转换为short(2个字节):

short value = ((short) audioData[0]) | ((short) audioData[1] << 8);

答案 6 :(得分:0)

我建议你看看Preon。在Preon,你可以说出这样的话:

class Sample {

  @BoundNumber(size="16") // Size of the sample in bits
  int value;

}

class AudioFile {

  @BoundList(size="...") // Number of samples
  Sample[] samples;

}

byte[] buffer = ...;
Codec<AudioFile> codec = Codecs.create(AudioFile.class);
AudioFile audioFile = codec.decode(buffer);

答案 7 :(得分:0)

您可以这样做,无需库或外部类。

byte myByte = (byte) -128;
for(int i = 0 ; i < 8 ; i++) {
    boolean val = (myByte & 256) > 0;
    myByte = (byte) (myByte << 1);
    System.out.print(val ? 1 : 0);
}
System.out.println();

答案 8 :(得分:-4)

byte myByte = 0x5B;

boolean bits = new boolean[8];

for(int i = 0 ; i < 8 ; i++)
    bit[i] = (myByte%2 == 1);

结果是一个零和一组1=TRUE0=FALSE:)