在Java中读取字节

在Java中读取字节,java,type-conversion,Java,Type Conversion,我试图理解以下代码行是如何工作的: for (int i = 0; i < numSamples; i++) { short ampValue = 0; for (int byteNo = 0; byteNo < 2; byteNo++) { ampValue |= (short) ((data[pointer++] & 0xFF) << (byteNo * 8)); } am

我试图理解以下代码行是如何工作的:

for (int i = 0; i < numSamples; i++) {
        short ampValue = 0;
        for (int byteNo = 0; byteNo < 2; byteNo++) {
            ampValue |= (short) ((data[pointer++] & 0xFF) << (byteNo * 8));
        }
        amplitudes[i] = ampValue;
    }
据我所知,这是以包容的方式读取2个字节作为每个样本的2个字节,即ampValue由两个字节读取组成。数据是实际的数据样本文件,指针正在增加以读取到最后一个样本。但我不明白这部分:

"data[pointer++] & 0xFF) << (byteNo * 8)); "

另外,我想知道如果我想把它读成双精度而不是短精度,是否会有什么区别?

在Java中,所有字节都是有符号的。表达式data[pointer++]&0xFF将有符号字节值转换为整数,如果该字节是无符号的,则该值为该字节的值。然后表达式看起来像data[]是字节数组

data[pointer++]为您提供范围为[-128..127]的字节值

0xFF是一个int常量,所以

data[pointer++]&0xFF将字节值提升为[-128..127]范围内的int值。然后,&运算符将0xFF中未设置的所有位归零,即,它将24个高位归零,只留下低位8位

现在该表达式的值将在范围[0..255]内


让我们把这句话分解一下:

|=是按位or和赋值运算符。a |=b相当于a=a | b。 short将int元素从数据数组转换为short。 指针++是一种增量后操作。指针的值将被返回并使用,然后在每次以这种方式访问指针时立即递增-在这种情况下这是有益的,因为外部循环通过内部循环从连续数据缓冲区循环通过2字节的样本,因此这将保持递增。 &是按位AND运算符,0xFF是十进制字节0b11111111 255的十六进制值;表达式data[pointer++]&0xFF的基本意思是,对于从数据数组检索到的字节中的每一位,使用1。在此上下文中,它强制Java(默认情况下存储有符号字节对象,即十进制中从-128到127的值)以无符号字节的形式返回值,即十进制中从0到255的值。
由于您的示例长度为2字节,您需要将第二批8位向左移位,作为最高有效位,使用左位移位运算符endianness会有问题吗?我知道它是16位little endian格式。。。但我对endianness知之甚少,也不认为这会成为一个问题@huseyinTugrulBuyukisik@huseyintugrulbuyukisik,在本例中,endian是硬编码的:无论平台架构如何,它总是以小endian顺序解释字节。这正是你想要的,如果你知道你是从一个已知的,小端文件格式读取。是的,振幅是ampValue,将立即修复!是否有其他方法可以不使用|=运算符直接从字节中读取double。我在这里找到了另一个例子:@NateRaswar,假设ampValue被正确地归零,那么在这个特定的例子中,|=操作符将给出与+=”相同的答案。|运算符只对类似int的值进行操作,它提供按位或。也就是说,如果设置了任一操作数中的位n,则将在结果中设置位n。在这种特殊情况下,数学运算的方式是,两个被“或”在一起的值之间不会有重叠,因此按位或有效值与添加两个操作数相同。非常感谢!它确实起作用了,我现在用+=操作符直接从数据中读取double。最后我不得不添加/32676.0。这两个修改和我在Matlab中读取的双值完全一样。刚刚修复了这个错误,ampValue就是振幅。现在有道理了。但是,你知道我怎么能把这当成一个替身?它在eclipse中表示,类型double的运算符|=未定义!将数据数组中的字节对象转换为短No,转换为短No的值是int值。当数组中的字节按位与int常量0xFF进行AND运算时,它们将被提升为int。@NateRaswar,啊,对了,好了!我将编辑我的答案,现在已经澄清了。short是一种整数,而double是一种浮点数,所以按位操作没有太大意义,这大概是为什么Java中不允许使用它的原因。如果需要将ampValue转换为double,则可以在下一行中将其转换为double变量@詹姆斯大号,哦,是的,我的错,当然了,哈哈。我会更新它,为指出它干杯。