

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

> 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フォーマットというやつなのですが、  
読みこみ途中で値が変わってしまっていて困っています。  
どうやったら元のままの値で読み込めますか？


CC BY-SA 3.0
2015-04-23T00:43:40.683
9486
2015-04-23T04:49:31.037
2015-04-23T04:04:17.070
49
9451
question
python
pythonでバイナリデータの読みこみ時に値が変わっているのはなぜ？


どのように値を確認したのかよくわからないのですが、0x38はASCIIで"8"になります。データとしては0x38と読んでいるが、その中身を確認する過程で文字として表示なり解釈してしまっているため"8"になっているだけではありませんか。


CC BY-SA 3.0
2015-04-23T00:59:56.497
9488
2015-04-23T00:59:56.497
5793
9486
answer


read() した結果をどう処理、確認してますか？

[code]

        data = f.read(40)
        print ['0x%x' % ord(x) for x in data]
    
[/code]

として本当に 38 が 8 になってますか？ 0x38 は "8" の ascii コードなので、単に勘違いしているように見えます。

[code]

        data = bytearray(f.read(40))
    
[/code]

とbytearrayに入れれば、入力をバイト列として処理できます。open() の "b" に、「read()
の結果をバイト列として扱う」という意味は残念ながらありません。


CC BY-SA 3.0
2015-04-23T01:17:54.470
9492
2015-04-23T01:44:17.050
2015-04-23T01:44:17.050
2521
2521
9486
answer


読み込んだデータの先頭から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するときだけ別の方法(他の方の回答にあるような)を使えば良いでしょう。


CC BY-SA 3.0
2015-04-23T04:49:31.037
9500
2015-04-23T04:49:31.037
806
9486
answer