2016-09-02 7 views
0

私は、ビッグエンディアンのバイト列に変換する符号付き16ビット整数の配列をpythonでstruct.packを使用しています。しかし、私はstruct.packが返す値は何かを理解していません。ここに例があります:なぜstruct.packはこれらの値を返しますか?

>>> bytestr = struct.pack('<9h',*[45, 70, 33, 38, -6, 26, 34, 46, 57]) 
>>> bytestr 
>>>> '-\x00F\x00!\x00&\x00\xfa\xff\x1a\x00"\x00.\x009\x00' 

「!」のようなすべての特殊文字があるのはなぜですか? '&'?それは各バイトの2文字の文字列でなければならないのですか?

答えて

1

Pythonで文字列の表現が表示されると、可能な限り、印刷可能なテキストを表示しようとします。 -,F,!,&などは、指定されたバイトに対して印刷可能なASCII文字である。

出力は完全に正しいです。

  • 45、リトルエンディアンのバイト列として、0x2D 0x00のhexademimal(10進数で45 00)として表現が、0x2Dバイト値もASCII文字セットの-文字です。

  • 70は0x46 0x00となり、0x46はASCIIの文字Fとなる。あなたが値を確認したい場合は、16進数表記印刷できませんでしたなど

  • 33は0x21では0x00になり、0x21では!

です:

>>> bytestr.encode('hex') 
'2d00460021002600faff1a0022002e003900' 

をかbytearray() objectに変換してリストに変換し、0-255の範囲の整数のリストを得ることができます。

>>> list(bytearray(bytestr)) 
[45, 0, 70, 0, 33, 0, 38, 0, 250, 255, 26, 0, 34, 0, 46, 0, 57, 0] 

これは、そのバイト列に正確な値がどのようなものかを示すさまざまな方法です。

関連する問題