c#BlockCopy偏移量和长度超出范围

时间:2017-05-29 20:50:29

标签: c# emulation

嘿,我有那段代码不起作用,并且一直让我的模拟器崩溃..

public byte[] SubArray(byte[] Data, int Offset, int Len)
   {
        byte[] Result = BitConverter.GetBytes(Len);
        Buffer.BlockCopy(Data, Offset, Result, 0, Len);
        return Result;
    }

LoginServer.exe中发生了'System.ArgumentException'类型的第一次机会异常

LoginServer.exe

中发生了未处理的“System.ArgumentException”类型异常

附加信息:偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数量。

我在C#中并没有真正的经验,但是我尝试了很多东西而没有工作,我在搜索方面做得最好,但由于我无法读取不同的代码,所以它从未奏效。

ps:我的字节结果是

byte[] Result = new byte[Len];

我认为这是一个问题所以我把它改成了

byte[] Result = BitConverter.GetBytes(Len);

但现在主要问题来自BlockCopy。

编辑:我在代码中更详细,我发现了主要错误。

 public Packet(byte[] Buffer, bool FromServer, out int Length)
    {
        using (Stream stream = new MemoryStream(Buffer))
        using (BinaryReader Reader = new BinaryReader(stream))
        {
            byte SecBytesLen = Reader.ReadByte();
            ushort DataLen = Reader.ReadUInt16();
            Length = SecBytesLen + DataLen + 2;
            Opcode = (ushort)(Reader.ReadUInt16() >> 1);
            Data = SubArray(Buffer, 14, DataLen - 14);
        }
    }

我试图移除那条线,它半工作而不会崩溃。

Data = SubArray(Buffer, 14, DataLen - 14);

如果您需要该代码中任何变量的更多详细信息,请告诉我......

在那之前就找到了那些。

public ushort Opcode = 0;
    public byte[] Data = new byte[0];

    public int ReaderPosition = 0;

    public Packet(ushort Opcode)
    {
        this.Opcode = Opcode;
    }

1 个答案:

答案 0 :(得分:0)

Len是一个整数,你得到组成该整数的字节,因此它们是4个字节。

如果您真正想要的是获取数组的一部分(我从函数的名称中扣除它),那么您应该这样做:

public byte[] SubArray(byte[] Data, int Offset, int Len)
{
    byte[] Result = new byte[Len];
    Buffer.BlockCopy(Data, Offset, Result, 0, Len);
    return Result;
}