我研究的是写一本AS3码BitString
成ByteArray
。来源: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))
?
&
是“和”位运算符或“和”条件。if(number)
在AS3手段if(number != 0)
?什么是这些AS3代码相当于在Java中?
在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
话虽如此,你可能希望从一开始就整数工作,并转换为字节以后。
你的代码目前转录位串到比特流切成字节。
如果一个字节中的所有位都设置一个特殊情况的处理,在这种情况下,为0xFF00输出。
什么是UINT(1个<< bytepos)?
该移动运营商由LHS bytepos
位向左:
1 << 4 -> 0b00010000
什么是如果条件如果(值UINT(1个<< posVal中))?我不知道是否与为“与”位运算符或“和”条件。
&
是按位,&&
是布尔值。
操作!= 0
- > TRUE
如果在比特posval
位置被设置。这是设置相应的位在字节的条件。
代码转移到Java应该是简单的实际。我建议你使用纯int
Java和转换为字节你写之前:
byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);
这样,你避免不断铸件字节和你避免消极字节上述问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句