使用 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# 代码现在应该可以运行了。
我需要使用 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# 代码现在应该可以运行了。