Python 读取二进制文件但遗漏了一些字节

Python read binary file but miss some byte

提问人:Jui-Chen Lo 提问时间:11/13/2023 更新时间:11/13/2023 访问量:52

问:

我试图使用 C++ 制作一些二进制文件并使用 python 进行读取。 这是我从互联网上得到的例子。 C++:

class CU {
   public:
    uint8_t widht;
    uint8_t height;
    uint16_t lx;
    uint16_t ly;
};
int main(){

    ofstream file("cu.dat", ios::out | ios::binary | ios:: trunc);
    if(!file) {
      cout << "Cannot open file!" << endl;
      return 1;
    }
    CU cu;
    cu.widht = 128;
    cu.height = 128;
    cu.lx = 128;
    cu.ly = 128;
    file.write((char*)&cu, sizeof(cu));
    file.close();
    return 0;
}

f = open("cu.dat", "rb")
data = f.read()
f.close()
print(data)

这是一个简单的程序。输出为 b'\x80\x80\x80\x00\x80\x00'

但是,如果 CU 的值较小,则有问题。 如果 CU.width 和 CU.height = 32 输出将为 b' \x80\x00\x80\x00' 或者如果 CU.width = 64 和 CU.height = 64 输出将为 b'@@\x80\x00\x80\x00'

我认为它将其读取为 UTF-8 编码。这是如何发生的,我应该怎么做才能避免这种情况?

解决二进制读取问题

Python C++ 二进制文件

评论

1赞 273K 11/13/2023
ASCII 码 32 对空格字符进行编码,64 对 @ 字符进行编码。一切都是正确的。
0赞 Matthias 11/13/2023
只是字节的表示让您感到困惑。 是 32,ord('@') 是 64。ord(' ')
0赞 Codist 11/13/2023
在二进制模式下处理文件时,编码无关紧要。您所看到的与字节序有关
0赞 Jui-Chen Lo 11/13/2023
谢谢,我明白了!所以这个数字是正确的。我只是需要一些东西来转换它。
0赞 Botje 11/13/2023
Python 模块允许指定格式字符串来拆分二进制 Blob。但是在这两个站点维护(反)序列化代码很累,所以只需跳过并开始使用平面缓冲区或协议缓冲区即可。struct

答: 暂无答案