문제
저는 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);
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
:)