0

我正在尝试使用需要我将 ID 作为字符串发送的 tcp it 服务。我从示例代码中得到了以下方法。我的问题是当我输入带有 4 个字符数字的字符串时,例如“4000”、“2000”、“3000”,该方法有效,但是当我输入少于 4 个字符的字符串时,“1”、“20”或“300”它返回

System.ArgumentException:目标数组不够长。检查 destIndex 和长度,以及数组的下限。

 public byte[] prepNetworkStreamBuffer(string reqiiredID) {
        byte[] id = UTF8Encoding.UTF8.GetBytes(reqiiredID);
        int l = id.Length;
        byte[] idb = BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(l));

        byte[] buff = new byte[1 + 1 + id.Length + l];
        buff[0] = 0;
        buff[1] = (byte)VerificationServiceCommands.addIDtoAFIS;
        idb.CopyTo(buff, 1 + 1);
        id.CopyTo(buff, 1 + 1 + idb.Length);

        return buff;
    }
4

3 回答 3

0
    public static bool TryGetArray(ref SomeObject[] source )
    {
        try
        {
            var localSource = new List<SomeObject>{new SomeObject(), new SomeObject()};

            var temp = new SomeObject[localSource.Count + source.Length];
            Array.Copy(source, temp, source.Length);
            Array.ConstrainedCopy(localSource.ToArray(), 0, temp, source.Length, localSource.Count);
            source = temp;
        }
        catch
        {
            return false;
        }
        return true;
    }
于 2014-04-10T16:43:55.217 回答
0

我怀疑问题是缓冲区长度是

1 + 1 + id.Length + l

什么时候应该

1 + 1 + idb.Length + l
        ^^^

检查此问题的最佳方法是启动调试器并查看buff.

于 2012-08-04T14:26:08.330 回答
0

您正在复制idbidto buff,这只是 size 2*id.Length + 2

因此,当id只有 3 号时,您的尺寸buff太小,无法容纳idb4 号。

你要:

byte[] buff = new byte[1 + 1 + id.Length + idb.Length];
于 2012-08-04T14:43:06.957 回答