如何在 python 中读取二进制文件(在 C# 中创建)?

How to read binary file (created in C#) in python?

我在 C# 中创建了一个二进制文件来存储浮点数。

BinaryFormatter formatter = new BinaryFormatter();
FileStream saveFile = File.Create(my_path);
formatter.Serialize(saveFile, data_to_store);
saveFile.Close();

C#可以很好的读取数据。但是我无法从 python.

读取它
f = open(path,'rb')
nums=int(os.path.getsize(fpath)/4)
data = struct.unpack('f'*nums,f.read(4*nums))
print(data)
f.close()
data =  np.array(data)

以上代码无效。

您似乎在尝试序列化浮点数的二进制数组。

如果您使用 BinaryFormatter.Serialize() 执行此操作,它也会写入一些 header 信息。我猜你不想要那个。

另请注意,BinaryFormatter.Serialize() 已过时,Microsoft 建议您不要使用它。

如果您只想将浮点数组作为二进制写入文件,没有 header 或其他无关数据,您可以在 .NET Core 3.1 或更高版本中这样做:

float[] data = new float[10];
using FileStream saveFile = File.Create(@"d:\tmp\test.bin");
saveFile.Write(MemoryMarshal.AsBytes(data.AsSpan()));

如果您使用的是 .Net 4.x,您必须这样做:

float[] data = new float[10];
using FileStream saveFile = File.Create(@"d:\tmp\test.bin");

foreach (float f in data)
{
    saveFile.Write(BitConverter.GetBytes(f), 0, sizeof(float));
}

即您必须使用 BitConverter.GetBytes() 将每个浮点数转换为字节数组,然后使用 Stream.Write().

将该数组写入文件

使用 .Net 从仅包含浮点字节的二进制文件中读取浮点数组 4.x:

首先你需要知道你将阅读多少花车。让我们假设整个文件只是写入浮点数组的字节。在这种情况下,您可以通过将文件长度除以 sizeof(float).

来确定浮点数

然后你可以单独读取每个浮点数并将其放入数组中(使用 BinaryReader 来简化事情):

using var readFile = File.OpenRead(@"d:\tmp\test.bin");
using var reader = new BinaryReader(readFile);

int nFloats = (int)readFile.Length / sizeof(float);
float[] input = new float[nFloats];

for (int i = 0; i < nFloats; ++i)
{
    input[i] = reader.ReadSingle();
}

实际上您可以使用 BinaryWriter 来简化文件的编写。将此与使用 BitConverter:

的代码进行比较
float[] data = new float[10];
using var saveFile = File.Create(@"d:\tmp\test.bin");
using var writer = new BinaryWriter(saveFile);

foreach (float f in data)
{
    writer.Write(f);
}

请注意 - 与 BinaryFormatter 不同 - BinaryReaderBinaryWriter 不读取或写入任何无关的 header 数据。他们只读和写你要求他们读的东西。