0

我有一个字符串,其中前 5 个字符从不为空,并且从 char 6 到结尾数据是可变长度。像这样的东西:

string inData = comPort1.ReadExisting();
//Console.WriteLine("inData: " + inData);
string origMsg = inData.Substring(4, 1);
//Console.WriteLine("origMsg: " + origMsg);
string seAnex = inData.Substring(5, 15);           // ArgumentOutOfRangeException
inData = inData.Substring(5, inData.Length - 8);
//Console.WriteLine("new inData: " + inData);

if (seAnex == "some_text_15_ch")
{
    //...
}
else
{
    //...
}

输出:

inData: {1112Test}
origMsg: 2
new inData: Test

此代码抛出一个ArgumentOutOfRangeException: Index and length must refer to a location within the string. 我该如何解决这个问题?

4

3 回答 3

2
string origMsg = inData.Substring(4, 1);

“startIndex 不能大于字符串的长度”

换句话说,

4 不能大于 inData 的长度

4 大于 inData 的长度

inData.Length 小于 4

于 2013-09-20T15:47:00.483 回答
1

我不确定你想用你的代码做什么。但是,如果只是为了解决异常。你可以这样修复:

        string inData = comPort1.ReadExisting();
        //Console.WriteLine("inData: " + inData);
        if (inData.Length >= 5)
        {
            string origMsg = inData.Substring(4, 1);
            //Console.WriteLine("origMsg: " + origMsg);
            //string seAnex = inData.Substring(5, 15);           // ArgumentOutOfRangeException
            string seAnex = inData.Substring(5, inData.Length - 5);
            //inData = inData.Substring(5, inData.Length - 8);
            //Console.WriteLine("new inData: " + inData);

            if (seAnex == "some_text_15_ch")
            {
                //...
            }
            else
            {
                //...
            }
        }

我想您的目的可以是从消息中获取数据信息,其格式类似于从 COM 通信接收到"{111abcxzy}"的长数据字符串?"{111abcxzy}{111abcxzy}{..."

于 2013-09-20T18:22:57.413 回答
0

我敢打赌,您没有您所说的字符串值。如果它实际上是 5+ 个字符长,那么当您在其上调用 SubString(4,1) 时,您将不会出现 ArgumentOutOfRange 异常。打印出值或在调试器中检查以确认

于 2013-09-20T15:46:35.880 回答