1

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」の意味は何ですか?

4

3 に答える 3

5

あなたは16進数に変換していません。整数をバイナリ データとしてパックしています。この場合は、リトルエンディアン バイナリ データです。最初の文字は、raw バイトに対応する ASCII 文字です。例: 89is Y122is z、 and 98is b

  • 最初のものは for をpack生成'\x59\x00\x00\x00'0x00000059ます。'\x59'です'Y'
  • 2 番目は for を生成'\x7a\x03\x00\x00'0x0000037aます。'\x7a'です'z'
  • 3 番目は for を生成'\x62\x07\x00\x00'0x00000762ます。'\x62'です'b'

以下の ASCII テーブルを参照してください。


(出典: asciitable.com )

于 2012-09-03T06:20:25.257 に答える
3

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 進数表記を使用しています。

于 2012-09-03T06:20:08.127 に答える
2

行ごとに説明しますが、最初にリトル
エンディアン形式と 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 /実整数値

于 2012-09-03T06:52:03.943 に答える