Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字节转换为位_Java_Types_Byte_Bitset - Fatal编程技术网

Java 将字节转换为位

Java 将字节转换为位,java,types,byte,bitset,Java,Types,Byte,Bitset,我在用java 我有一个字节数组(数组的每个位置有8位),我需要做的是把数组的2个值放在一起,得到一个值 我会尽力更好地解释自己;我正在从音频文件中提取音频数据。该数据存储在字节数组中。每个音频样本的大小为16位。如果阵列为: 字节[]音频数据 我需要从样本audioData[0]和audioData[1]中获取1个值,以获取1个音频样本 谁能告诉我怎么做 提前感谢。假设LSB位于数据[0] int val; val = (((int)data[0]) & 0x00FF) | ((in

我在用java

我有一个字节数组(数组的每个位置有8位),我需要做的是把数组的2个值放在一起,得到一个值

我会尽力更好地解释自己;我正在从音频文件中提取音频数据。该数据存储在字节数组中。每个音频样本的大小为16位。如果阵列为:

字节[]音频数据

我需要从样本audioData[0]和audioData[1]中获取1个值,以获取1个音频样本

谁能告诉我怎么做


提前感谢。

假设LSB位于数据[0]

int val;

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

val=((int)data[0])&0x00FF)|((int)data[1]我不是Java开发人员,因此这可能会完全不正确,但您是否考虑过使用?

您可以通过逻辑或将两个字节合并来转换为
短的
(2字节):

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

short value=((short)audioData[0])|((short)audioData[1]正如前面所建议的,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);

我建议你看一下。在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);
类示例{
@BoundNumber(size=“16”)//以位为单位的样本大小
int值;
}
类音频文件{
@边界列表(size=“…”)//样本数
样本[]个样本;
}
字节[]缓冲区=。。。;
Codec Codec=Codecs.create(AudioFile.class);
AudioFile AudioFile=codec.decode(缓冲区);
上述代码的优点是,您可以以相同的方式继续读取其余的“数据”

仅针对两个值的简单解决方案可能是:

short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));
short value=(short)((音频数据[0]
byte myByte=0x5B;
布尔位=新的布尔[8];
对于(int i=0;i<8;i++)
位[i]=(我的字节%2==1);

结果是一个0和1的数组,其中
1=TRUE
0=FALSE
:)

在Java中,将字节数组解析为位的更简单方法是


代码将把每个字节的解析位作为8字节放在解析类实例的位数组中

您可以这样做,没有库或外部类

byte myByte = (byte) -128;
for(int i = 0 ; i < 8 ; i++) {
    boolean val = (myByte & 256) > 0;
    myByte = (byte) (myByte << 1);
    System.out.print(val ? 1 : 0);
}
System.out.println();
byte myByte=(byte)-128;
对于(int i=0;i<8;i++){
布尔值=(myByte&256)>0;

myByte=(字节)(myByte它不是完全偏离基准。不,太简单了;必须使用屏蔽来避免符号扩展。ShortBuffer在这里可能更合适。这不处理字节1上的符号扩展。问题是如何在读取字节字节时设置整数值。因此,每当整数被符号扩展时,它将保持不变,我完全不确定它是否是c既然这样,我们就得小心了。难道你不想要像
bit[i]=((myByte&(1))这样的东西吗
byte myByte = 0x5B;

boolean bits = new boolean[8];

for(int i = 0 ; i < 8 ; i++)
    bit[i] = (myByte%2 == 1);
  class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
  final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);
byte myByte = (byte) -128;
for(int i = 0 ; i < 8 ; i++) {
    boolean val = (myByte & 256) > 0;
    myByte = (byte) (myByte << 1);
    System.out.print(val ? 1 : 0);
}
System.out.println();