指数超出范围。必须是非负数且小于集合的大小。参数名称:索引
Posted
技术标签:
【中文标题】指数超出范围。必须是非负数且小于集合的大小。参数名称:索引【英文标题】:Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 【发布时间】:2013-07-02 08:17:49 【问题描述】:我使用网络平台来验证我的用户是否允许使用应用程序,但如果可能的话,我有一些错误请求帮助我,谢谢你的帮助,我的错误是:
2013-07-04 15:06:14 - NPMessage:调试:调度 RPCAuthenticateValidateTicketMessage 2013-07-04 15:06:14 - NPMessage: 错误:System.ArgumentOutOfRangeException:索引超出范围。 必须是非负数且小于集合的大小。 参数名称:startIndex 在 System.BitConverter.ToUInt64(Byte[] value, Int32 startIndex) 在 NPx.RPCAuthenticateValidateTicketMessage.ReadTicket(字节 [] 字节) 在 NPx.RPCAuthenticateValidateTicketMessage.Process(NPHandler 客户端) 在NPx.NPMessage.Process()
我的来源是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using NPx;
namespace NPx
public partial class RPCAuthenticateValidateTicketMessage : NPRPCMessage<AuthenticateValidateTicketMessage>
public override void Process(NPHandler client)
var ipNum = (uint)IPAddress.NetworkToHostOrder(Message.clientIP);
var ip = new IPAddress(BitConverter.GetBytes(ipNum));
var ticket = ReadTicket(Message.ticket);
var npid = Message.npid;
if (npid == 0)
npid = ticket.clientID;
var valid = false;
var groupID = 0;
if (ticket.version == 1)
if (client.NPID == (long)ticket.serverID)
if (npid == ticket.clientID)
var remoteClient = NPSocket.GetClient((long)ticket.clientID);
remoteClient.CurrentServer = client.NPID;
if (remoteClient != null && !remoteClient.Unclean)
Log.Debug("Ticket auth: remote address " + remoteClient.Address.Address.ToString());
Log.Debug("Ticket auth: message address " + ip.ToString());
if (ipNum == 0 || remoteClient.Address.Address.Equals(ip))
valid = true;
groupID = remoteClient.GroupID;
Log.Debug("Successfully authenticated a ticket for client " + remoteClient.NPID.ToString("x16"));
else
Log.Debug("Ticket auth: IP address didn't match.");
else
Log.Debug("Ticket auth: no such client");
else
Log.Debug("Ticket auth: NPID didn't match.");
else
Log.Debug("Ticket auth: server NPID didn't match.");
else
Log.Debug("Ticket auth: version didn't match.");
var reply = MakeResponse<AuthenticateValidateTicketResultMessage>(client);
reply.Message.result = (valid) ? 0 : 1;
reply.Message.groupID = groupID;
reply.Message.npid = npid;
reply.Send();
private class NPTicket
public int version;
public ulong clientID;
public ulong serverID;
public uint time;
private NPTicket ReadTicket(byte[] bytes)
var ticket = new NPTicket();
ticket.version = BitConverter.ToInt32(bytes, 0);
if (ticket.version == 1)
ticket.clientID = BitConverter.ToUInt64(bytes, 4);
ticket.serverID = BitConverter.ToUInt64(bytes, 12);
ticket.time = BitConverter.ToUInt32(bytes, 20);
return ticket;
....
【问题讨论】:
Message.ticket 的值是多少? 完整源代码在这里你可以看到:pastebin.com/Pw3ipy4k @user2468671 你需要了解问题才能解决问题。请检查我的答案 【参考方案1】:在访问其位置 0、4、12 和 20 之前,检查 private NPTicket ReadTicket(byte[] bytes)
内的 bytes
的大小。
【讨论】:
@user2468671 我不打算查看完整的源代码。我根据你的问题回答了。您应该使用我的回答作为进一步调查您的问题的工具。【参考方案2】:byte[] bytes
长度可能小于您期望的索引 (0,4,12,20)
例如:
打电话时
BitConverter.ToUInt64(bytes, 12);
此函数从指定索引(第二个参数)通过数组bytes
移动,并期望从字节[12] 开始的8 个字节,以便将它们转换为int64。 (ToInt32 需要 4 个字节)
所以你有 2 个案例:
==> 案例 1:
bytes
的长度可能小于 13,这意味着 bytes[12] 无效,因此会抛出异常:Index was out of range
在调用索引之前尝试检查字节 [] 的长度
==> 案例2:
从指定索引开始的数组中没有足够的字节数。
例子 :
如果您的数组bytes
的长度为15 .. 调用BitConverter.ToUInt64(bytes, 12);
时将引发异常,因为该函数将占用字节[12]、字节[13]、字节[14]、bytes[15](哎呀,这是你的问题).. 直到 bytes[19]。
【讨论】:
【参考方案3】:为了进一步说明 Siraj 的观点,您可以将 BitConverter 调用包装在 try...catch 中
int machineUint = 0;
try
machineUint = BitConverter.ToUInt16(bytes, 12);
catch (IndexOutOfRangeException indexer)
machineUint = 0;
catch (Exception ex)
machineUint = 0;
如果出现错误将产生 0,因为 index is out of range 异常和一般异常情况的输出。
【讨论】:
以上是关于指数超出范围。必须是非负数且小于集合的大小。参数名称:索引的主要内容,如果未能解决你的问题,请参考以下文章
指数超出范围。必须为非负数且小于集合参数 name:index 的大小