读取 UInt16 数字仅二进制文件
本文关键字:二进制文件 数字 UInt16 读取 | 更新日期: 2023-09-27 18:33:02
如果我正在读取字节数,我会这样做:
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
int size = (int) stream.Length;
BinaryReader br = new BinaryReader(stream);
byte[] test = new byte[size];
test = br.ReadBytes(size);
br.Close();
}
但是由于我想阅读Uint16,我感到震惊:
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
int size = (int) stream.Length;
BinaryReader br = new BinaryReader(stream);
float[] test = new byte[size/2];
for (int i = 0; i < size/2; ++i)
{
test[i] = br.ReadUInt16();
}
br.Close();
}
有没有更快的方法一次读取整个文件,或者速度差异可以忽略不计?
如果文件不是太大而无法放入内存,则将所有字节读取到 MemoryStream 中,然后从该流中读取 Uint16 会更快。这样:
byte[] data;
int size;
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
size = (int) stream.Length;
data = new byte[size];
stream.Read(data, 0, size);
}
uint[] uintData = new uint[size / 2];
using (var memoryStream = new MemoryStream(data))
using (var reader = new BinaryReader(memoryStream))
for (int i = 0; i < size / 2; i++)
uintData[i] = reader.ReadUInt16();
// Done.
首先,您不需要此行:
byte[] test = new byte[size];
因为下面一行
test = br.ReadBytes(size);
使test
指向另一个数组。所以
byte[] test = br.ReadBytes(size);
够。
关于您的问题:由于BinaryReader.ReadBytes
只是在循环中执行Stream.Read
(您可以使用 ILSpy 或通过查看参考源代码来验证这一点),我假设您的代码示例之间的性能差异可以忽略不计。可以肯定的是,我建议您进行一些测量。