pythonでバイナリデータの読みこみ時に値が変わっているのはなぜ？


バイナリエディタで開くと次のようなデータがあります。

> 00 00 0B D7 15 04 04 04 38 00 00 00 13 E8 00 00  
>  ～以下略

次のようなコードでファイルを読み込み、データを取り出そうとすると、  
値が若干変わっており、上の38の部分が8になってしまっていました。

[code]

    f = open(inputfiles,"rb")
    f.read(40)
    
[/code]

> 00 00 0B D7 15 04 04 04 8 00 00 00 13 E8 00 00

他にもいくつかの箇所で読み込むと値が変わっているようです。

可変長の地震関係で使われるwinフォーマットというやつなのですが、  
読みこみ途中で値が変わってしまっていて困っています。  
どうやったら元のままの値で読み込めますか？




読み込んだデータの先頭から9byte目ですね。

[code]

    >>> f = open(inputfiles,"rb")
    >>> data = f.read(40)
    >>> data[8]
    '8'
    
[/code]

データとしてはちゃんと '0x38' のままです。

[code]

    >>> hex(ord(data[8]))
    '0x38'
    
[/code]

16進数の38がASCII文字の'8'だったので、Pythonがインタラクティブシェルでそのように表示したのを勘違いした、ということでしょう（他の方の回答通りです）

[code]

    >>> hex(ord('\x38'))
    '0x38'
    >>> hex(ord('8'))
    '0x38'
    
[/code]

これは、Python2でbyte列を扱うのも、文字列(非Unicode文字)を扱うのも、str型で行っているためで、str型を画面に表示するときにデータを文字として解釈しているためです。メモリ上の値はちゃんと0x38なので、画面にprintするときだけ別の方法(他の方の回答にあるような)を使えば良いでしょう。

