0

我正在尝试从内存映射文件中读取 c 样式的 unicode 字符串并IndexOutOfRangeException发生了,所以我通过逐个字符复制 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<>,但我做不到。

4

2 回答 2

1

在 中ReadArray,您使用第一个参数指示所需的位置,并将数组内的偏移量作为第三个参数:

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

所以:

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

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

尝试:

view.ReadArray<char>(sizeof(UInt64), buffer, 0, len);
于 2012-10-11T12:20:45.190 回答
0

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

VS 2010 的 Intellisense 错误地描述了 ReadArray<> 的参数。

(may vary with language/locale of VS)

于 2012-10-11T12:21:26.490 回答