5

私はRubyを使用しており、メッセージ自体を送信する前に「ヘッダー」のフォーマットを必要とするネットワークエンドポイントと通信しています。

ヘッダーの最初のフィールドは、ネットワークバイトオーダーの2バイナリバイトのメッセージ長として定義されているメッセージ長である必要があります。

たとえば、私のメッセージの長さは1024です。1024をバイナリ2バイトとして表すにはどうすればよいですか?

4

2 に答える 2

5

Ruby(およびPerlとPythonと...)でのバイトラングリングの標準ツールはとpackですunpack。RubypackはにありArrayます。長さは2バイトで、ネットワークバイトオーダーである必要があります。これは、nフォーマット指定子の仕事のように聞こえます。

n | 整数| 16ビット符号なし、ネットワーク(ビッグエンディアン)バイトオーダー

したがって、長さがの場合、length2バイトが次のように取得されます。

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

反対のことをする必要がある場合は、以下を見てくださいString#unpack

length = two_bytes.unpack('n').first
于 2012-12-10T04:13:27.007 に答える
4

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 バイトで正確に表すことができません。

于 2012-12-10T04:14:06.617 に答える