Estou pesquisando este código AS3 que escrever uma BitString
em uma ByteArray
. Fonte: 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;
}
}
}
Mas eu não entendo parte do código.
- O que é
uint(1 << bytepos)
? - Qual é a condição if
if (value & uint(1 << posval))
?- Eu não sei se o
&
é "e" operador bit, ou "e" condição. - Será que
if(number)
no meio AS3if(number != 0)
?
- Eu não sei se o
O que é isso código AS3 equivalente em Java?
operações bit a bit em Java são um pouco estranho, porque Java não possui nenhum tipo não assinados. Então, quando você pretende trabalhar com bytes, você deve se certificar de que você ficar com bytes. Coisas como 0x0f | 0x80 -> 0b1000 1111 feito com bytes deve ser convertido para bytes o tempo todo:
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
Dito isto, você pode querer trabalhar com ints desde o início e lançou para bytes mais tarde.
O código que você presentes transcreve a bitstring em um corte de fluxo de bits em bytes.
Um caso especial é tratado se todos os bits de um byte são definidas, em que 0xff00 caso é de saída.
O que é uint (1 << bytepos)?
Isso move a LHS do operador de bytepos
bits para a esquerda:
1 << 4 -> 0b00010000
Qual é a condição if if (value & uint (1 << posval))? Eu não sei se o & é "e" operador bit, ou "e" condição.
&
é bit a bit E, &&
é boolean.
A operação é != 0
-> TRUE
se o bit na posval
posição está definido. Esta é a condição para definir o bit correspondente no byte.
Transferir o código para Java deve ser simples na verdade. Sugiro que você use plain int
em java e converter para byte apenas antes de escrever:
byte realByte = (byte)(intbyte & (byte)0xff);
writeByte(realByte);
Desta forma, você evita vazamento constante para byte e você evitar o acima mencionado problema com bytes negativos.