我正在研究将此BitString
写入ByteArray
的AS3代码。来源:JPGEncoder#writeBits()
private var byteout:ByteArray;
private var bytenew:int = 0;
private var bytepos:int = 7;
private function writeBits(bs:BitString):void
{
var value:int = bs.val;
var posval:int = bs.len-1;
while (posval >= 0) {
if (value & uint(1 << posval)) {
bytenew |= uint(1 << bytepos);
}
posval--;
bytepos--;
if (bytepos < 0) {
if (bytenew == 0xFF) {
writeByte(0xFF);
writeByte(0);
} else {
writeByte(bytenew);
}
bytepos=7;
bytenew=0;
}
}
}
但是我不理解部分代码。
uint(1 << bytepos)
?if (value & uint(1 << posval))
是什么?
&
是“ and”位运算符还是“ and”条件。if(number)
意味着if(number != 0)
吗?这些AS3代码在Java中等效于什么?
答案 0 :(得分:3)
Java中的按位操作有些尴尬,因为Java没有无符号类型。 因此,当您打算使用字节时,应确保保留字节。像0x0f | 0x80-> 0b1000 1111使用字节完成的操作必须始终转换为字节:
System.out.printf("%x - %x - (byte)%x - (int)%x\n",
(byte)0x80,
(byte)0xf,
(byte)((byte)0x80|(byte)0xf),
(int)((byte)0x80|(byte)0xf));
OUTPUT:
80 - f - (byte)8f - (int)ffffff8f
话虽如此,您可能要从一开始就使用int,然后再转换为字节。
您提供的代码将BitString转换为切成字节的比特流。
如果设置了字节的所有位,则处理特殊情况,在这种情况下,输出0xff00。
什么是uint(1 << bytepos)?
这会将运算符的lhs向左移动bytepos
位:
1 << 4 -> 0b00010000
if条件if(value&uint(1 << posval))是什么? 我不知道&是“ and”位运算符还是“ and”条件。
&
是按位AND,&&
是布尔值。
如果已设置!= 0
位置的位,则操作为TRUE
-> posval
。这是设置字节中相应位的条件。
实际上,将代码传输到Java应该很简单。我建议您在Java中使用普通的int
并在编写之前将其转换为字节:
byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);
这样,您可以避免将常量强制转换为字节,并且可以避免上述负字节问题。
答案 1 :(得分:2)