指数超出范围.必须是非负数且小于集合的大小.参数名称:索引

本文关键字:集合 参数 索引 小于 范围 是非 指数 | 更新日期: 2023-09-27 18:20:55

我使用网络平台来验证我的用户以允许使用应用程序,但是如果可能的话,我有一些错误请求帮助我感谢您的帮助,我的错误是:

2013-07-04 15:06:14 - NPMessage: 调试: 调度 RPCAuthenticateValidateTicketMessage 2013-07-04 15:06:14 - NPMessage: 错误:System.ArgumentOutOfRangeException:索引超出范围。 必须是非负数且小于集合的大小。 参数名称:启动索引 at System.BitConverter.ToUInt64(Byte[] value, Int32 startIndex( at NPx.RPCAuthenticateValidateTicketMessage.ReadTicket(Byte[] bytes( at NPx.RPCAuthenticateValidateTicketMessage.Process(NPHandler client( at 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;
     }
 }
....   
}

指数超出范围.必须是非负数且小于集合的大小.参数名称:索引

在访问其位置 0、4、12 和 20 之前,检查 private NPTicket ReadTicket(byte[] bytes) 内部bytes的大小。

byte[] bytes长度可能小于预期的索引 (0,4,12,20(

例如:

呼叫时

BitConverter.ToUInt64(bytes, 12);

此函数从指定的索引(第二个参数(遍历数组bytes,并期望从字节 [12] 开始有 8 个字节,以便将它们转换为 int64。(ToInt32 需要 4 个字节(

所以你有2种情况:

==> 案例 1 :

bytes的长度可能<13,这意味着字节[12]无效,因此它将抛出异常: 索引超出范围

尝试在调用索引之前检查字节 [] 的长度

==> 案例2 :

从指定索引开始的数组中没有足够的字节。例:如果您的数组bytes长度为 15 ..调用BitConverter.ToUInt64(bytes, 12);时将抛出异常,因为该函数将占用字节[12],字节[13],字节[14],字节[15](哎呀,有你的问题(。直到字节[19]。

为了进一步说明Siraj的观点,您可以尝试包装BitConverter调用...抓住

        int machineUint = 0; 
        try
        {
            machineUint = BitConverter.ToUInt16(bytes, 12);
        }
        catch (IndexOutOfRangeException indexer)
        {
           machineUint = 0;
        }
        catch (Exception ex)
        {
           machineUint = 0;
        }

错误时将产生 0,因为索引的输出超出范围异常和一般异常情况。