2012-12-10 9 views
5

Używam Ruby i komunikuję się z punktem końcowym sieci, który wymaga sformatowania nagłówka przed wysłaniem samej wiadomości.Ruby - Jak reprezentować długość wiadomości jako 2 bajty binarne

Pierwsze pole w nagłówku musi być długością wiadomości, która jest zdefiniowana jako 2 binarna długość wiadomości w kolejności bajtów sieciowych.

Na przykład moja wiadomość ma 1024 długości. Jak mogę przedstawić 1024 jako dwójkowe bajty binarne?

Odpowiedz

5

Standardowe narzędzia do sprawdzania bajtów w Ruby (oraz Perl i Python i ...) to pack i unpack. Ruby's pack is in Array. Masz długość, która powinna mieć długość dwóch bajtów i kolejność bajtów sieciowych, która brzmi jak zadanie dla specyfikatora formatu n:

n | Integer | 16-bitowa bez znaku, sieć (big-endian) kolejności bajtów

Więc jeśli długość jest w length, że masz swoje dwa bajty wygląda następująco:

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

Jeśli trzeba zrobić odwrotnie , rzucić okiem na String#unpack:

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

Zobacz Array#pack.

[1024].pack("n") 

to zestawy numer jak sieć rzędu sekwencja bajtów \x04\x00.

Sposób działania polega na tym, że każdy bajt składa się z 8 bitowych bitów. 1024 w systemie binarnym to 10000000000. Jeśli podzielimy to na oktety 8 (8 bitów na bajt), otrzymamy: 00000100 00000000.

Bajt może reprezentować (2 stany)^(8 pozycji) = 256 unikatowych wartości. Ponieważ jednak nie mamy 256 znaków drukowalnych, możemy wizualnie przedstawić bajty jako pary heksadecymalne, ponieważ cyfra szesnastkowa może reprezentować 16 różnych wartości i 16 * 16 = 256. W ten sposób możemy pobrać pierwszy bajt, 00000100 i przerwać na dwa heksadecymalne kwadraty jako 0000 0100. Tłumaczenie pliku binarnego na szesnastkowy daje nam 0x04. Drugi bajt jest banalny, ponieważ 0000 0000 to 0x00. To daje nam naszą szesnastkową reprezentację dwubajtowego ciągu znaków.

Warto zauważyć, że ponieważ jesteś ograniczony do 2-bajtowego (16-bitowego) nagłówka, jesteś ograniczony do maksymalnej wartości 11111111 11111111 lub 2^16 - 1 = 65535 bajtów. Każda większa wiadomość nie może dokładnie reprezentować jej długości w dwóch bajtach.