C# BinaryReader.ReadBytes – 读取字节数组

  • Post category:C#

BinaryReader.ReadBytes 方法是C#中的一个方法,主要作用是读取指定长度的字节序列,并返回一个字节数组。通常用于读取二进制文件中的数据,在网络编程中也有应用。

该方法有一个参数,即待读取字节数 length。当读取完指定长度的字节后,该方法会返回一个长度为 length 的字节数组。如果在读取过程中遇到文件结束或者读取长度超过了文件的长度,则该方法会返回一个长度小于 length 的字节数组。

该方法的使用需要先创建一个 BinaryReader 类型的实例,然后调用其 ReadBytes 方法进行数据读取。具体使用方法如下:

using (FileStream fs = new FileStream("data.bin", FileMode.Open))
{
    using (BinaryReader br = new BinaryReader(fs))
    {
        byte[] data = br.ReadBytes(10);  // 读取10个字节
        // 处理读取到的数据
    }
}

在使用该方法时,需要保证读取的字节数与实际数据长度匹配,否则可能会出现数据解析错误或者数据截断等问题。

以下是两个使用示例:

  1. 从二进制文件中读取一个字符串
using (FileStream fs = new FileStream("data.bin", FileMode.Open))
{
    using (BinaryReader br = new BinaryReader(fs))
    {
        byte[] data = br.ReadBytes(20);  // 读取20个字节
        string str = Encoding.UTF8.GetString(data);
        Console.WriteLine(str);  // 输出读取到的字符串
    }
}
  1. 读取二进制文件中的一个结构体
struct MyStruct
{
    public int intValue;
    public float floatValue;
}

using (FileStream fs = new FileStream("data.bin", FileMode.Open))
{
    using (BinaryReader br = new BinaryReader(fs))
    {
        byte[] data = br.ReadBytes(sizeof(MyStruct));  // 读取结构体的字节数
        MyStruct myStruct = new MyStruct();
        GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
        try
        {
            IntPtr ptr = handle.AddrOfPinnedObject();
            myStruct = Marshal.PtrToStructure<MyStruct>(ptr);
        }
        finally
        {
            handle.Free();
        }
        // 处理读取到的结构体数据
    }
}

以上示例中,第一个示例演示了如何使用 ReadBytes 方法读取一个字符串,第二个示例演示了如何使用 ReadBytes 方法读取一个结构体。在读取结构体时,需要使用 GCHandle 类将字节数组固定,然后再使用 Marshal.PtrToStructure 将字节流转化成结构体。