从二进制格式文件中读取32位整数数组?

时间:2011-01-20 07:11:30

标签: c#

好的,所以我使用BinaryWriter将文件转换为二进制格式。格式为:

整数,然后是整数。

因此代码将类似于:

readLineOfNumbers() {
    count = read();
    int[] a = read(count ints);
    return a;
}

我是否使用BinaryReader?我能看到的最接近的事情是将所有内容读入byte [],但是如何将其作为一个int数组呢?这一切都必须非常有效地完成。我需要缓冲等等。

3 个答案:

答案 0 :(得分:2)

如果使用BinaryWriter创建文件,则使用BinaryReader

读取它是有意义的

类似的东西:

private static int[] ReadArray(BinaryReader reader)
    {
        int count = reader.ReadInt32();
        int[] data = new int[count];
        for (int i = 0; i < count; i++)
        {
            data[i] = reader.ReadInt32();
        }
        return data;
    }

答案 1 :(得分:1)

int[] original = { 1, 2, 3, 4 }, copy;
byte[] bytes;
using (var ms = new MemoryStream())
{
    using (var writer = new BinaryWriter(ms))
    {
        writer.Write(original.Length);
        for (int i = 0; i < original.Length; i++)
            writer.Write(original[i]);
    }
    bytes = ms.ToArray();
}
using (var ms = new MemoryStream(bytes))
using (var reader = new BinaryReader(ms))
{
    int len = reader.ReadInt32();
    copy = new int[len];
    for (int i = 0; i < len; i++)
    {
        copy[i] = reader.ReadInt32();
    }
}

虽然我个人只是从w {o BinaryReader开始阅读。

实际上,严格说话,如果是我,我会使用我的own serializer,只是:

[ProtoContract]
public class Foo {
    [ProtoMember(1, Options = MemberSerializationOptions.Packed)]
    public int[] Bar {get;set;}
}

因为这将具有已知的字节序,处理缓冲,并且如果大多数数字不是很大,将使用可变长度编码来帮助减少膨胀。

答案 2 :(得分:1)

我不知道BinaryReader中会读取整数数组的任何内容,我担心。如果您读入字节数组,则可以使用Buffer.BlockCopy将这些字节复制到int[],这可能是最快的转换形式 - 尽管它依赖于处理器的字节顺序适合您的数据

您是否尝试只是循环,根据需要多次调用BinaryReader.ReadInt32(),并让文件系统进行缓冲?如果你认为这会有所帮助,你总是可以在混合中添加一个带有大缓冲区的BufferedStream