57512


バイナリデータがうまく読み込めずに困っています。

バイナリデータ

[code]

    04725f06799b6081101c0103803e22782e08a5a2574fa2280f5054bfef8081c0810081809500b300
    
[/code]

仮にこのデータをdata.binとして保存します。

[code]

    if __name__ == '__main__':
        fp = open('C:\\data.bin','br')
        data = fp.read()
        print(data)
        fp.close()
    
[/code]

元のバイナリデータを1バイトずつ扱いたいのですが、dataの中身は、以下のようになってしまいます。

[code]

    b'\x04r_\x06y\x9b`\x81\x10\x1c\x01\x03\x80>"x.\x08\xa5\xa2WO\xa2(\x0fPT\xbf\xef\x80\x81\xc0\x81\x00\x81\x80\x95\x00\xb3\x00'
    
[/code]

Cで記述した場合、

[code]

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int a;
        char str1[256];
        FILE *fp;
        errno_t err;
    
        err = fopen_s(&fp,"C:\\data.bin","r");
    
        if (err == 0) {
            int cnt = 0;
            while((a = fgetc(fp)) != EOF){
                if (cnt < 256) {
                    str1[cnt] = a;
                    cnt++;
                }
                putchar(a);
            }
            fclose(fp);
        }
    
        return 0;
    }
    
[/code]

str1の内容は、バイトごとに読み取っていけば、もとのバイナリデータを復元できます。  
※str1の大きさ256は適当に最大サイズにしていて、初期化をしていないため、代入していない配列には不定のキャラクタが入りますが気にしないでください。

Cのように、バイナリデータを文字データに代入すれば、文字列としては成り立ちませんが、元のデータは扱える・・・このようなことをPythonで実現するにはどうすればよいでしょうか？


CC BY-SA 4.0
2019-08-21T05:31:23.927
57507
2019-08-21T17:02:16.630
2019-08-21T17:02:16.630
3060
32891
question
python python3
Python　バイナリデータがうまく読み込めない。


print()関数の表示結果だからそのように見えるのであって、`data`を配列として考えれば1バイトづつ扱えるはずです。

例えばこんな感じで1バイトづつ16進数文字列と文字に対比して表示するとか、

[code]

    for c in data:
        print(hex(c) + ' : ' + chr(c))
    
[/code]

結果は

[code]

    0x4 : 
    0x72 : r
    0x5f : _
    0x6 : 
    0x79 : y
    0x9b : 
    0x60 : `
    0x81 : 
    ...後略
    
[/code]

とか、特定の位置から内容を取得するなら、

[code]

    a = data[0]
    b = data[1]
    c = data[2]
    
[/code]

とかですね。

内容を書き換えたいなら、`bytearray`型に変換してから操作しましょう。

[code]

    ba = bytearray(data)
    ba[3] = 0x30
    ba[4] = 0x31
    ba[5] = 0x32
    
[/code]

参考記事  
[bytes, bytearray](http://python-
remrin.hatenadiary.jp/entry/2017/05/23/130843)


CC BY-SA 4.0
2019-08-21T06:02:39.313
57512
2019-08-21T07:13:08.477
2019-08-21T07:13:08.477
26370
26370
57507
answer