2011-11-26 21 views
9

Sto appena iniziando a conoscere la compressione dei file e mi sono imbattuto in un po 'di un roadblock. Ho un'applicazione che codificherà una stringa come "programma" come una rappresentazione binaria compressa "010100111111011000" (nota che questo è ancora memorizzato come stringa).Conversione di una rappresentazione di stringa di bit in un byte

Encoding 
g  111 
r  10 
a  110 
p  010 
o  011 
m  00 

Ora ho bisogno di scrivere questo al file di sistema utilizzando un FileOutputStream, il problema che sto avendo è, come posso convertire la stringa "010.100.111,111011 miliardi" per un byte[]/s byte da scrivere nel file sistema con FileOutputStream?

Non ho mai lavorato con bit/byte prima quindi mi trovo in un vicolo cieco qui.

+0

Si parla di una "rappresentazione binaria compressa", quindi si dice di avere un 'String' di 18 caratteri (" 010100111111011000 ") per rappresentare una parola lunga 7 caratteri (" programma "). Sei sicuro di voler dire quello che stai chiedendo? Normalmente avresti quei bit impostati nel numero X di byte (3 in questo caso). –

+0

Cerca "operatori di spostamento dei bit": '>>', '>>>', '<<'. – Kevin

+0

Brian, il messaggio originale ha una dimensione di 56 bit quando viene tradotto in binario, il messaggio codificato è solo di 18 bit. Kevin, la gente continua a dirmelo, ma non riesco ancora a tracciare il collegamento tra l'uso di quegli operatori e la possibilità di tradurre questo in un array di byte. –

risposta

6

Un'introduzione agli operatori bit-shift:

primo luogo, abbiamo l'operatore di sinistra-shift, x << n. Questo sposterà tutti i bit in x lasciati dagli n bit, riempiendo i nuovi bit da zero:

 1111 1111 
<< 3: 1111 1000 

Avanti, abbiamo il sottoscritto operatore destra-shift, x >> n. Questo sposta tutti i bit in x proprio n, copiando il bit di segno nei nuovi bit:

 1111 1111 
>> 3: 1111 1111 

     1000 0000 
>> 3: 1111 0000 

     0111 1111 
>> 3: 0000 1111 

Infine, abbiamo l'operatore zero riempire shift destro, x >>> n. Questo sposta tutti i bit in x proprio n bit, riempiendo i nuovi bit da zero:

 1111 1111 
>>> 3: 0001 1111 

È inoltre possibile trovare utile il bit-o gestore, x | y.Ciò confronta i bit in ogni posizione in x e y, impostando il bit del nuovo numero sul se fosse su in entrambi x o y, fuori altrimenti:

1010 0101 
| 1010 1010 
    --------- 
    1010 1111 

si deve solo bisogno dei precedenti operatori per il problema a portata di mano , ma per ragioni di completezza, qui sono gli ultimi due:

il bit a bit-ed esercente, x & y imposta i bit in uscita a uno se e solo se il bit è attivo sia x e y:

1010 0101 
& 1010 1010 
    --------- 
    1010 0000 

L'operatore binario-xor, x^y imposta i bit di uscita a uno se il bit è attivo in un numero o l'altro, ma non entrambi:

1010 0101 
^ 1010 1010 
    --------- 
    0000 1111 

Ora, applicando questi alla situazione contingente:

Sarà necessario utilizzare gli operatori di spostamento di bit per aggiungere e manipolare i bit. Iniziare a impostare i bit sul lato destro in base alle loro rappresentazioni di stringa e spostarli. Continua finché non raggiungi la fine di un byte, quindi passa al byte successivo. Diciamo che vogliamo creare una rappresentazione di byte di "1100 1010":

Our byte Target 
--------- -------- 
0000 0000 
      1100 1010 
0000 0001 ^
      1100 1010 
0000 0011 ^
      1100 1010 
0000 0110 ^
      1100 1010 
0000 1100 ^
      1100 1010 
0001 1001  ^
      1100 1010 
0011 0010  ^
      1100 1010 
0110 0101  ^
      1100 1010 
1100 1010   ^

farò, ovviamente, lasciare a voi per applicare questo al vostro lavoro.

+0

Una domanda, per iniziare il mio byte come 0000 0001, equivale a scrivere byte b = 1; ? Non sono sicuro, a causa della natura firmata del byte, come sapere qual è la rappresentazione binaria perché non so quale bit rappresenta il segno. –

+0

Si potrebbe fare ciò, ma per coerenza si vorrà iniziare con un byte zero e quindi inserire un ciclo 'for' o' while'. Modificherò un po 'l'esempio per vedere se riesco a renderlo un po' più chiaro. – Kevin

0

Immagino che tu voglia scrivere questi zeri e quelli come valori binari in un file. Quindi, è possibile ripetere la stringa prendendo 8 segni ogni volta (String.substring() o smth) e creare byte con il costruttore Byte (String). È la soluzione più semplice che mi viene in mente per ora.

Se non ho ragione riguardo al problema, parlane di più per favore.

+0

Ho provato questo, il costruttore Byte (String) prenderà una stringa "0011" e lo interpreterà letteralmente come il numero decimale 11. –

+0

Ecco perché si dovrebbe Byte Costruttore (String s, int radix) per impostare il binario binario. –

1

Tritare il numero String in lunghezze di 8 e chiamare Byte#parseByte. Se si imposta radix su 2, verrà analizzato il numero String come numero binario.

+1

Eccezione nel thread "main" java.lang.NumberFormatException: valore fuori intervallo. Valore: Radice "10000000": 2 Funziona solo su lunghezze di 7 a meno che non ci siano zeri iniziali, qualche idea? –

+0

@John Lotacs Non ho idea del perché lo stia facendo, ma puoi usare ['Integer # parseInt'] (http://tinyurl.com/7uo6b5t) e lanciarlo su' byte' per una soluzione. – Jeffrey

+0

@jeff Lo sta facendo perché 'byte' è firmato, quindi deve essere' -111 1111' a '+111 1111' (da -128 a +127). Un byte con bit di '1000 0000' è in realtà -128, e dovrebbe essere alimentato al parser come' -1000 0000'. – Kevin