2012-12-10 10 views
5

Sto utilizzando Ruby e sto comunicando con un endpoint di rete che richiede la formattazione di un 'header' prima di inviare il messaggio stesso.Ruby - Come rappresentare la lunghezza del messaggio come 2 byte binari

Il primo campo nell'intestazione deve essere la lunghezza del messaggio che è definita come una lunghezza di 2 byte byte binari nell'ordine dei byte di rete.

Ad esempio, il mio messaggio è 1024 di lunghezza. Come rappresento 1024 come due byte binari?

risposta

5

Gli strumenti standard per il byte wrangling in Ruby (e Perl e Python e ...) sono pack e unpack. Ruby's pack is in Array. Hai una lunghezza che dovrebbe essere lunga due byte e in ordine di byte di rete, che sembra un lavoro per lo specificatore di formato n:

n | Intero | A 16 bit senza segno, di rete (big-endian) byte order

Quindi, se la lunghezza è in length, otterreste i vostri due byte così:

two_bytes = [ length ].pack('n') 

Se avete bisogno di fare il contrario , dare un'occhiata a String#unpack:

length = two_bytes.unpack('n').first 
4

Vedi Array#pack.

[1024].pack("n") 

Questa pacchi il numero come la rete ordine sequenza di byte \x04\x00.

Il modo in cui questo funziona è che ogni byte è 8 bit binari. 1024 in binario è 10000000000. Se lo suddividiamo in ottetti di 8 (8 bit per byte), otteniamo: 00000100 00000000.

Un byte può rappresentare (2 stati)^(8 posizioni) = 256 valori univoci. Tuttavia, poiché non abbiamo 256 caratteri stampabili in formato ASCII, rappresentiamo visivamente i byte come coppie esadecimali, poiché una cifra esadecimale può rappresentare 16 valori diversi e 16 * 16 = 256. Pertanto, possiamo prendere il primo byte, 00000100 e interrompere in due quad esadecimali come 0000 0100. Traducendo binario in esadecimale ci dà 0x04. Il secondo byte è banale, poiché 0000 0000 è 0x00. Questo ci dà la nostra rappresentazione esadecimale della stringa a due byte.

Vale la pena notare che, poiché si è costretti ad un collettore 2-byte (16 bit), è limitato ad un valore massimo di 11111111 11111111, o 2^16 - 1 = 65535 byte. Qualsiasi messaggio più grande di quello non può rappresentare con precisione la sua lunghezza in due byte.

Problemi correlati