在从短到字节数组的转换中,我在web上找到了以下解决方案,但不太理解其中的逻辑。
//buffer is an array of bytes, bytes[]
buffer[position] = (byte)(sample & 0xff);
buffer[position+1] = (byte)((sample >> 8) & 0xff);谁能告诉我为什么0xff (256)被a到一个短值的样本上?
发布于 2008-11-07 18:19:37
这段代码可能来自C代码(或者是由不像erickson那样解析Java的C程序员编写的)。这是因为在Java中,从具有较多信息的类型到具有较少信息的类型的强制转换将丢弃高阶位,因此在这两种情况下都不需要& 0xff。
short有16位,两个字节。所以它需要字节数组中的两个槽,因为如果我们只是将一个短值强制转换为一个字节,那么一个字节就会丢失。
因此,您拥有的代码可以
1110001100001111 sample
0000000011111111 0xff
0000000000001111 sample & 0xff => first byte`然后,置换样本以获得第二个字节
0000000011100011 sample >> 8
0000000011111111 0xff
0000000011100011 (sample >> 8 ) & 0xff => second byte它可以写得更好,就像erickson在下面展示的那样(希望它很快就会出现)。
发布于 2008-11-07 19:29:52
其他答案有一些很好的信息,但不幸的是,它们都推广了关于转换为字节的错误想法。
在原始代码中,& 0xFF在这两种情况下都是不必要的。
缩小类型转换将丢弃不适合较窄类型的高位。事实上,& 0xFF实际上首先使short提升为int,其中最高有效的24位被清除,然后由cast将其截断并填充到一个字节中。有关详细信息,请参阅Java Language Specification Section §5.1.3。
buffer[position] = (byte) sample;
buffer[position+1] = (byte) (sample >>> 8);另外,请注意我使用了带零扩展的右移位,而不是符号扩展。在这种情况下,因为您立即将移位的结果转换为一个字节,所以这并不重要。但是,通常情况下,运算符给出的结果不同,您应该谨慎选择。
发布于 2008-11-07 18:19:58
它确保没有溢出;具体地说,第一行是获取“LSByte”的MSByte并屏蔽高8位,只给出0-255范围内的值;第二行是获取"sample“的样本(通过执行右移位)并执行相同的操作。这在第二行不应该是必须的,因为右移8应该会去掉8个最低有效位,但它确实使代码更对称一点。
我假设这是因为sample是一个短的(2个字节),在256-6553范围内的任何值都会被字节转换解释为255。
https://stackoverflow.com/questions/273029
复制相似问题