读取 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();
}

有没有更快的方法一次读取整个文件,或者速度差异可以忽略不计?

读取 UInt16 数字仅二进制文件

如果文件不是太大而无法放入内存,则将所有字节读取到 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 或通过查看参考源代码来验证这一点),我假设您的代码示例之间的性能差异可以忽略不计。可以肯定的是,我建议您进行一些测量