Pythonの構造体モジュールで数字を16進数に変えると、
>>> import struct
>>> struct.pack("i",89)
'Y\x00\x00\x00'
>>> struct.pack("i",890)
'z\x03\x00\x00'
>>> struct.pack("i",1890)
'b\x07\x00\x00'
出力の「Y、z、b」の意味は何ですか?
あなたは16進数に変換していません。整数をバイナリ データとしてパックしています。この場合は、リトルエンディアン バイナリ データです。最初の文字は、raw バイトに対応する ASCII 文字です。例: 89
is Y
、122
is z
、 and 98
is b
。
pack
生成'\x59\x00\x00\x00'
し0x00000059
ます。'\x59'
です'Y'
。'\x7a\x03\x00\x00'
し0x0000037a
ます。'\x7a'
です'z'
。'\x62\x07\x00\x00'
し0x00000762
ます。'\x62'
です'b'
。以下の ASCII テーブルを参照してください。
(出典: asciitable.com )
16 進数に変換するのではなく、データを生のバイトに変換していることに注意してください。コンソールは、Python のリテラル文字列として再度入力できる形式で、これらのバイトをエコー バックします。
そのため、python はリテラル バイト stringを出力しており、一部のバイトは ASCII 文字として表すことができます。範囲 0x21-0x7E のほとんどのバイトは、次のように出力できます。
>>> '\x22'
'"'
>>> '\x50'
'P'
したがって、「Y」、「z」、および「b」はその範囲に入るバイトであり、Python はそれらを\x
エスケープではなく ASCII として出力するだけです。
>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'
残りのバイトは印刷可能な ASCII 範囲外にあるため、Python はこれらを\xFF
リテラルとして表し、たまたま 16 進数表記を使用しています。
行ごとに説明しますが、最初にリトル
エンディアン形式と char 値を理解する必要があり
ます。実際には (0x04, 0x03, 0x02, 0x01)文字値'Y' = 0x59 = 89, 'z' = 0x7a = 122, 'b' = 0x62 = 98
'Y\x00\x00\x00' = 0x59, 0x00, 0x00, 0x00 /メモリ内のデータ
'Y\x00\x00\x00' = 0x00000059 = 89 /実整数値
'z\x03\x00\x00' = 0x7a, 0x03, 0x00, 0x00 /メモリ内のデータ
'z\x03\x00\x00' = 0x0000037a = 890 /実整数値
'b\x0b\x07\x00' = 0x62, 0x07, 0x00, 0x00 /メモリ内のデータ
'b\x0b\x07\x00' = 0x00000762 = 1890 /実整数値