문제

저는 Java와 함께 일하고 있습니다.

바이트 어레이 (배열의 각 위치에 8 비트)가 있으며 내가해야 할 일은 배열 값 중 2 개를 모으고 값을 얻는 것입니다.

나는 나 자신을 더 잘 설명하려고 노력할 것이다. 오디오 파일에서 오디오 데이터를 추출하고 있습니다. 이 데이터는 바이트 어레이에 저장됩니다. 각 오디오 샘플의 크기는 16 비트입니다. 배열이 다음과 같은 경우

바이트 [] Audiodata;

내가 필요한 것은 1 개의 오디오 샘플을 얻기 위해 샘플 Audiodata [0] 및 Audiodata [1]에서 1 값을 얻는 것입니다.

누구 든지이 작업을 수행하는 방법을 설명 할 수 있습니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

나는 Java 개발자가 아니므로 완전히 기본이 될 수 있지만 사용을 고려해 보았습니다. 바이트 버퍼?

다른 팁

LSB가 데이터에 있다고 가정합니다 [0

int val;

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

이전에 제안한 바와 같이, Java는이를 도와 줄 수업이 있습니다. 배열을 a로 감을 수 있습니다 바이트 버퍼 그런 다음 얻습니다 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);
ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();

위의 코드의 장점은 나머지 '데이터'를 동일한 방식으로 계속 읽을 수 있다는 것입니다.

두 가지 값에 대한 간단한 솔루션은 다음과 같습니다.

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

이 간단한 솔루션은 두 개의 바이트를 추출하고 첫 번째 바이트와 함께 고차 비트이고 두 번째 바이트는 하위 차수 비트입니다 (이것은 빅 엔디 언으로 알려져 있습니다. 바이트 어레이가 리틀 엔디안 데이터가 포함 된 경우 전환 할 것입니다. 16 비트 숫자의 경우 두 번째 바이트는 16 비트 숫자의 경우, Little-Endian 32 비트 숫자의 경우 Java의 정수가 Big-Endian 주문을 따를 것이기 때문에 4 바이트의 순서를 뒤집어 야합니다).

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 바이트로 배치합니다.

당신은 a로 변환 할 수 있습니다 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);

결과는 다양한 0과 1=TRUE 그리고 0=FALSE :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top