私はRubyを使用しており、メッセージ自体を送信する前に「ヘッダー」のフォーマットを必要とするネットワークエンドポイントと通信しています。
ヘッダーの最初のフィールドは、ネットワークバイトオーダーの2バイナリバイトのメッセージ長として定義されているメッセージ長である必要があります。
たとえば、私のメッセージの長さは1024です。1024をバイナリ2バイトとして表すにはどうすればよいですか?
Ruby(およびPerlとPythonと...)でのバイトラングリングの標準ツールはとpack
ですunpack
。Rubypack
はにありArray
ます。長さは2バイトで、ネットワークバイトオーダーである必要があります。これは、n
フォーマット指定子の仕事のように聞こえます。
n | 整数| 16ビット符号なし、ネットワーク(ビッグエンディアン)バイトオーダー
したがって、長さがの場合、length
2バイトが次のように取得されます。
two_bytes = [ length ].pack('n')
反対のことをする必要がある場合は、以下を見てくださいString#unpack
。
length = two_bytes.unpack('n').first
Array#packを参照してください。
[1024].pack("n")
これにより、数値がネットワーク順序バイト シーケンスとしてパックされます\x04\x00
。
これが機能する方法は、各バイトが 8 バイナリ ビットであることです。バイナリの 1024 は10000000000
. これを 8 オクテット (1 バイトあたり 8 ビット) に分割すると、次のようになります00000100 00000000
。
1 バイトは (2 状態) ^ (8 位置) = 256 の一意の値を表すことができます。ただし、256 個の ascii 印刷可能な文字がないため、視覚的にバイトを 16 進数のペアとして表現します。16 進数は 16 の異なる値と 16 * 16 = 256 を表すことができるためです。したがって、最初のバイトを取得して分割することができます00000100
。として 2 つの 16 進数クワッドに変換し0000 0100
ます。2 進数を 16 進数に変換すると、 が得られ0x04
ます。2 番目のバイトは、そのままで簡単0000 0000
です0x00
。これにより、2 バイト文字列の 16 進数表現が得られます。
2 バイト (16 ビット) のヘッダーに制限されているため、最大値が11111111 11111111
、または 2^16 - 1 =65535
バイトに制限されていることに注意してください。それより大きいメッセージは、その長さを 2 バイトで正確に表すことができません。