簡體   English   中英

指數超出范圍。 必須是非負數且小於集合的大小。 參數名稱:index

[英]Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

我使用網絡平台驗證我的用戶允許使用應用程序,但我有一些錯誤請求,如果可能幫助我謝謝你的幫助,我的錯誤是:

2013-07-04 15:06:14 - NPMessage:DEBUG:調度RPCAuthenticateValidateTicketMessage 2013-07-04 15:06:14 - NPMessage:錯誤:System.ArgumentOutOfRangeException:索引超出范圍。 必須是非負數且小於集合的大小。 參數名:startIndex 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;
     }
 }
....   
}

在訪問其位置private NPTicket ReadTicket(byte[] bytes)和20之前,檢查private NPTicket ReadTicket(byte[] bytes)內的bytes大小。

byte[] bytes長度可能小於您期望的索引(0,4,12,20)

例如 :

打電話的時候

BitConverter.ToUInt64(bytes, 12);

此函數從指定的索引(第二個參數)移動數組bytes ,並期望從bytes [12]開始的8個字節,以便將它們轉換為int64。 (ToInt32需要4個字節)

所以你有2個案例:

==>案例1:

bytes長度可能<13,這意味着字節[12]無效,因此它將拋出異常: 索引超出范圍

在調用索引之前,請嘗試檢查byte []的長度

==>案例2:

從指定的索引開始,數組中沒有足夠的字節。 示例:如果您的數組bytes 長度為15 ..當調用BitConverter.ToUInt64(bytes, 12); 將拋出異常,因為該函數將占用字節[12],字節[13],字節[14], 字節[15] (哎呀有你的問題)..直到字節[19]。

為了進一步說明Siraj的觀點,你可以在try ... catch中包裝BitConverter

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

並且在出錯時將產生0作為索引的輸出超出范圍異常和一般異常情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM