memo.log

技術情報の雑なメモ

【Ruby】ビッグエンディアン・ネットワークバイトオーダー、サンプルメモ

pack("n") で、ネットワークバイトオーダー(ビッグエンディアン)のunsigned short (16bit 符号なし整数)に変換できる。 ビッグエンディアンなので、バイトの上位から並べていく。 例えば、 0xAABBCCDD だったら、0xDDが低い(1桁目側)側なので逆から、AA, BB, CC, DD というふうに格納するのがビッグエンディアンpack("n") の場合は、16bit = 2Byte に変換する。1Byte=16進数で2桁なので2Byteは \xNN\xNN みたいな出力になる。

例)

> [1].pack("n")
=> "\x00\x01"
> [1].pack("n")[0]
=> "\x00"
> [1].pack("n")[1]
=> "\x01"

もとの数値は1、もし2Byteで表現するなら 00000000 00000001 = \x00\x01 で、 pack すると "\x00\x01" になる。見た目は低い方が1だが、Ruby文字列的には

[1].pack("n")[0] => "\x00"

のように下位が0、上位が1なので、人間の見た目にすると、 00000001 00000000 と解釈できる。 つまり、1をバイト上位から並べている=ビッグエンディアン

参考

pack テンプレート文字列 (Ruby 3.0.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/doc/pack_template.html