使用 C# BinaryReader 读取 python 二进制文件

Reading a python binary file with a C# BinaryReader

我需要使用 python 将一些数据(如整数、浮点数等)导出到二进制文件中。之后,我不得不再次用 C# 读取文件,但它对我不起作用。

我尝试了几种使用 python 编写二进制文件的方法,只要我也使用 python 读取它,它就可以工作:

a = 3
b = 5

with open('test.tcd', 'wb') as file:
    file.write(bytes(a))
    file.write(bytes(b))

或者这样写:

import pickle as p

with open('test.tcd', 'wb') as file:
    p.dump([a, b], file)

目前我正在用 C# 读取文件,如下所示:

static void LoadFile(String path)
{
       BinaryReader br = new BinaryReader(new FileStream(path, FileMode.Open));
       int a = br.ReadInt32();
       int b = br.ReadInt32();

       System.Diagnostics.Debug.WriteLine(a);
       System.Diagnostics.Debug.WriteLine(b);

       br.Close();
}

不幸的是,输出不是 3 和 5,而是我的输出只是零。如何正确读取或写入二进制文件?

可能 python 没有以 C# 期望的相同格式写入数据。您可能需要交换字节字节顺序或做其他事情。您可以改为读取原始字节并使用 BitConverter 查看是否可以解决问题。

另一种选择是在 python 中明确指定字节顺序,我认为大端是 C# 的默认二进制 reader 格式。

an_int = 5


a_bytes_big = an_int.to_bytes(2, 'big')

print(a_bytes_big)

Output

b'\x00\x05'


a_bytes_little = an_int.to_bytes(2, 'little')

print(a_bytes_little)

Output

b'\x05\x00'

在 Python 中,您必须编写每个整数 4 个字节。在这里阅读更多:struct.pack

a = 3
b = 5

with open('test.tcd', 'wb') as file:
     f.write(struct.pack("<i", 3))
     f.write(struct.pack("<i", 5))

您的 C# 代码现在应该可以运行了。