Конвертировать байты в биты - PullRequest
5 голосов
/ 03 июня 2009

Я работаю с Java.

У меня есть байтовый массив (8 бит в каждой позиции массива), и мне нужно собрать 2 значения массива и получить значение.

Я постараюсь объяснить себя лучше; Я извлекаю аудиоданные из аудиофайла. Эти данные хранятся в байтовом массиве. Каждый аудиосэмпл имеет размер 16 бит. Если массив:

байт [] audioData;

Мне нужно получить 1 значение из семплов audioData [0] и audioData [1], чтобы получить 1 аудиосэмпл.

Может кто-нибудь объяснить мне, как это сделать?

Заранее спасибо.

Ответы [ 8 ]

7 голосов
/ 03 июня 2009

Я не Java-разработчик, так что это может быть совершенно не по основанию, но вы рассматривали возможность использования ByteBuffer ?

4 голосов
/ 03 июня 2009

Предположим, что LSB находится в данных [0]

int val;

val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
1 голос
/ 13 августа 2014

Более простой способ разбора массива байтов на биты в Java - это Использование JBBP

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

код будет помещать проанализированные биты каждого байта как 8 байтов в массив битов экземпляра Parsed класса

1 голос
/ 26 октября 2009
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-битных чисел, для 32-битных чисел с прямым порядком байтов вам пришлось бы изменить порядок всех 4 байтов, потому что целые числа Java следуют за порядком больших порядков).

1 голос
/ 04 июня 2009

Как предлагалось ранее, в 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);
0 голосов
/ 22 ноября 2010
byte myByte = 0x5B;

boolean bits = new boolean[8];

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

Результатом является массив нулей и единиц, где 1=TRUE и 0=FALSE:)

0 голосов
/ 10 октября 2009

Предлагаю вам взглянуть на Преон . В 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);
0 голосов
/ 03 июня 2009

Вы можете преобразовать в short (2 байта) путем логического объединения двух байтов вместе:

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