1

我似乎得到了OutOfRangeException以下说明:“索引超出表格限制”(不准确的翻译,我的 VS 是法语),这是相关代码:

pntrs = new int[Pntrnum];
for (int i = 0; i < Pntrnum; i++)
{
    stream.Position = Pntrstrt + i * 0x20;
    stream.Read(data, 0, data.Length);
    pntrs[i] = BitConverter.ToInt32(data, 0);
}

Strs = new string[Pntrnum];
for (int i = 0; i < Pntrnum; i++)
{
    byte[] sttrings = new byte[pntrs[i + 1] - pntrs[i]];//the exception occures here !
    stream.Position = pntrs[i];
    stream.Read(sttrings, 0, sttrings.Length);
    Strs[i] = Encoding.GetEncoding("SHIFT-JIS").GetString(sttrings).Split('\0')[0].Replace("[FF00]", "/et").Replace("[FF41]", "t1/").Replace("[FF42]", "t2/").Replace("[FF43]", "t3/").Replace("[FF44]", "t4/").Replace("[FF45]", "t5/").Replace("[FF46]", "t6/").Replace("[FF47]", "t7/").Replace("[0a]", "\n");

    ListViewItem item = new ListViewItem(new string[]
                {
                    i.ToString(),
                    pntrs[i].ToString("X"),
                    Strs[i],
                    Strs[i],
                });
    listView1.Items.AddRange(new ListViewItem[] {item});
}

难道我做错了什么 ?

4

3 回答 3

4

C# 数组是零索引的;也就是说,数组索引从零开始(在你的情况下,你有从 0 到Pntrnum-1in 的元素pntrs),所以当i == Pntrnum - 1 pntrs[i + 1]尝试访问边界之外的元素时pntrs

于 2013-07-02T17:35:29.473 回答
4

i+1 是循环最后一次迭代的问题 假设最后一个索引在 9 中,那么它将尝试获取 10 的问题

于 2013-07-02T17:38:49.003 回答
3

OutOfRangeException由于 i + 1 在以下行中,您得到了:

byte[] sttrings = new byte[pntrs[i + 1] - pntrs[i]];

您可以通过以下方式轻松防止这种情况:

for (int i = 0; i < Pntrnum - 1; i++)
{
    byte[] sttrings = new byte[pntrs[i + 1] - pntrs[i]];
    ...
}

这将防止 i + 1 超出范围。

于 2013-07-02T17:42:11.810 回答