Вопрос

Я работаю с 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 :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top