如何在 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
不同 - BinaryReader
和 BinaryWriter
不读取或写入任何无关的 header 数据。他们只读和写你要求他们读的东西。
我在 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
不同 - BinaryReader
和 BinaryWriter
不读取或写入任何无关的 header 数据。他们只读和写你要求他们读的东西。