我正在尝试从内存映射文件中读取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<>
,但我不能。
答案 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的语言/区域而异)