Così al lavoro ieri, ho dovuto scrivere un'applicazione per contare le pagine in un file AFP. Così ho rispolverato il mio MO: PDF di specifiche DCA e ho trovato il campo strutturato BPG (Begin Page)
e il suo identificatore a 3 byte. L'app deve essere eseguita su una scatola AIX, quindi ho deciso di scriverla in Java.Informazioni sui byte Java
Per la massima efficienza, ho deciso di leggere i primi 6 byte di ogni campo strutturato e quindi di saltare i restanti byte nel campo. Questo otterrebbe me:
0: Start of field byte
1-2: 2-byte length of field
3-5: 3-byte sequence identifying the type of field
Così ho controllare il tipo di campo e incrementare un contatore pagina se è BPG
, e io non fare se non lo è. Quindi salterò i restanti byte nel campo invece di leggerli. E qui, nel salto (e davvero nella lunghezza del campo) è dove ho scoperto che Java utilizza i byte firmati.
Ho fatto qualche ricerca su google e ho trovato un bel po 'di informazioni utili. La maggior parte utile, naturalmente, era l'istruzione per fare un bit a bit &
a 0xff
per ottenere il valore int unsigned. Questo è stato necessario per ottenere una lunghezza che potrebbe essere utilizzata nel calcolo del numero di byte da saltare.
Ora so che a 128 inizieremo il conteggio indietro da -128. Quello che voglio sapere è come funziona l'operazione bitwise qui - in particolare, come arrivo alla rappresentazione binaria per un numero negativo.
Se capisco correttamente il bit a bit &
, il risultato è uguale a un numero in cui sono impostati solo i bit comuni dei due numeri. Quindi, supponendo byte b = -128
, avremmo:
b & 0xff // 128
1000 0000-128
1111 1111 255
---------
1000 0000 128
Così come sarei arrivato a 1000 0000 per -128? Come otterrei la rappresentazione binaria di qualcosa di meno ovvio come -72 o -64?
+1 per la menzione che l'operazione si verifica in un interno con estensione di segno. –
Questo è esattamente quello che cercavo, grazie mille.Questo è il motivo per cui adoro Stackoverflow. –