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