Преобразование байтов в биты
Вопрос
Я работаю с java.
У меня есть массив байтов (по 8 бит в каждой позиции массива), и что мне нужно сделать, это сложить вместе 2 значения массива и получить значение.
Я постараюсь объясниться получше;Я извлекаю аудиоданные из аудиофайла.Эти данные хранятся в массиве байтов.Размер каждого звукового сэмпла составляет 16 бит.Если массив равен:
байт[] Аудиоданных;
Что мне нужно, так это получить 1 значение из сэмплов audioData[0] и audioData[1], чтобы получить 1 сэмпл аудио.
Кто-нибудь может объяснить мне, как это сделать?
Заранее благодарю.
Решение
Я не разработчик Java, так что это может быть совершенно нестандартно, но рассматривали ли вы возможность использования Байтбуфер?
Другие советы
Предположим, что LSB находится в data[0]
int val;
val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
Как предлагалось ранее, в Java есть классы, которые помогут вам в этом.Вы можете обернуть свой массив с помощью Байтбуфер и затем получите Встроенный буфер посмотреть на это.
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);
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;если бы ваш массив байтов содержал данные младшего порядка, вы бы вместо этого сдвинули второй байт для 16-битных чисел;для 32-разрядных чисел младшего порядка вам пришлось бы изменить порядок всех 4 байт на обратный, потому что целые числа Java следуют порядку большого порядка).
более простой способ в 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 байт в массив bits экземпляра проанализированного класса
Вы можете преобразовать в short
(2 байта) путем логического объединения двух байтов вместе:
short value = ((short) audioData[0]) | ((short) audioData[1] << 8);
Я предлагаю вам взглянуть на Преон.В 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);
byte myByte = 0x5B;
boolean bits = new boolean[8];
for(int i = 0 ; i < 8 ; i++)
bit[i] = (myByte%2 == 1);
Результатом является массив нулей и единиц, где 1=TRUE
и 0=FALSE
:)