MemoryMappedViewAccessor.ReadArray<>抛出IndexOutOfRangeException

时间:2012-10-11 12:14:43

标签: c# memory-mapped-files

我正在尝试从内存映射文件中读取c样式的unicode字符串并发生IndexOutOfRangeException,所以我通过char复制char来修复它,但我想使用ReadArray ,更具可读性。

MemoryMappedFile file = MemoryMappedFile.OpenExisting("some name");
MemoryMappedViewAccessor view = file.CreateViewAccessor();
int len = (int)view.ReadUInt64(0); // Length of string + 1 is stored.
char[] buffer = new char[len];
//view.ReadArray<char>(0, buffer, sizeof(UInt64), len); // EXCEPTION
for (int i = 0; i < len; i++) // char by char, works fine.
    buffer[i] = view.ReadChar(sizeof(UInt64) + sizeof(char) * i);

试图找到一个简短的例子,说明如何使用ReadArray<>,但我不能。

2 个答案:

答案 0 :(得分:1)

ReadArray中,您使用第一个参数指示所需位置,并将数组中的偏移指定为第3个参数:

public int ReadArray<T>(
    long position,
    T[] array,
    int offset,
    int count
)

所以:

view.ReadArray<char>(0, buffer, sizeof(UInt64), len);

是说在从sizeof(UInt64)sizeof(UInt64) + len - 1的索引处填充数组 - 这将始终溢出可用的索引值(假设sizeof(UInt64)大于0: - ))。

尝试:

view.ReadArray<char>(sizeof(UInt64), buffer, 0, len);

答案 1 :(得分:0)

在ReadArray中,Param 1和3应该交换。

VS 2010的Intellisense错误地描述了ReadArray&lt;&gt;的参数。

(可能因VS的语言/区域而异)