Estoy investigando el código AS3 que escribir BitString
en una ByteArray
. Fuente: 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;
}
}
}
Pero no entiendo parte del código.
- ¿Qué es
uint(1 << bytepos)
? - ¿Cuál es la condición if
if (value & uint(1 << posval))
?- No sé si el
&
es "y" operador de bits, o "y" condición. - Lo hace
if(number)
en el medio de AS3if(number != 0)
?
- No sé si el
¿Cuál es el código AS3 éstos equivalente en Java?
operaciones bit a bit en Java son un tanto incómoda, porque Java no tiene los tipos sin signo. Así que cuando usted tiene la intención de trabajar con bytes, debe asegurarse de que permanezca con bytes. Cosas como 0x0f | 0x80 -> 1111 0b1000 hecho con bytes se tiene que convertir bytes todo el tiempo:
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
Habiendo dicho esto, es posible que desee trabajar con enteros desde el principio y fundido a bytes más tarde.
El código que transcribe la cadena de bits presentes en un corte de flujo de bits en bytes.
Un caso especial es manejado si se establecen todos los bits de un byte, en ese caso es 0xff00 salida.
Lo que es uint (1 << bytepos)?
Esto mueve el LHS del operador de bytepos
bits a la izquierda:
1 << 4 -> 0b00010000
¿Cuál es la condición if si (valor y uint (1 << posval))? No sé si el y es "y" operador de bits, o "y" condición.
&
es AND bit a bit, &&
es booleano.
La operación es != 0
-> TRUE
si el bit en posval
la posición se establece. Esta es la condición para establecer el bit correspondiente en el byte.
Transferir el código de Java debe ser sencillo en realidad. Yo sugeriría que utilice llanura int
en Java y convertido al byte justo antes de escribir:
byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);
De esta manera, se evita la fundición constante de bytes y se evita el problema mencionado anteriormente con bytes negativos.