C# Substring方法(Int32,Int32)抛出ArgumentOutOfRangeException

C# Substring方法(Int32,Int32)抛出ArgumentOutOfRangeException,c#,winforms,substring,argumentexception,C#,Winforms,Substring,Argumentexception,我有一个字符串,其中前5个字符从不为空,从char 6到end data是变量leght。大概是这样的: string inData = comPort1.ReadExisting(); //Console.WriteLine("inData: " + inData); string origMsg = inData.Substring(4, 1); //Console.WriteLine("origMsg: " + origMsg); string seAnex = inData.Substr

我有一个字符串,其中前5个字符从不为空,从char 6到end data是变量leght。大概是这样的:

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
{
    //...
}
        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
            {
                //...
            }
        }
输出:

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

此代码抛出一个
ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置
。我如何解决这个问题?

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

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

string origMsg = inData.Substring(4, 1);
“startIndex不能大于字符串的长度”

换句话说,

4不能大于inData的长度

4大于inData的长度

inData.Length小于4

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

换句话说,

4不能大于inData的长度

4大于inData的长度


inData.Length小于4

我不确定您想对代码做什么。但是,如果只是为了解决这个例外。您可以这样修复:

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
{
    //...
}
        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
            {
                //...
            }
        }

我猜您的目的是从一条消息中获取数据信息,该消息的格式类似于长数据字符串中的
“{111abcxzy}”
”{111abcxzy}{…,它是从COM通信接收的。

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

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
{
    //...
}
        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
            {
                //...
            }
        }

我猜您的目的可能是从长数据字符串中的格式为
“{111abcxzy}”
的消息中获取数据信息
“{111abcxzy}{111abcxzy}{…”
从COM通信接收到的信息?

您阅读了文档吗?您确定您的输入长度始终至少为5个字符吗?在调试或输出失败时运行它。(此外,您是否正在修剪空白?可能这就是丢弃它的原因。您的初始值为长度5或更长,然后您修剪减少其长度。)@mafap好的,这是第四次,你需要找出什么是
inData
。你的代码不会用你提供的值抛出
ArgumentOutOfRangeException
。我以前遇到过这个问题。问题是子字符串是不友好的,它不使用智能。它完全按照你告诉它的去做,如果输入字符串太大或太小,会引发异常。哎呀,我忘记了字符串末尾的}括号。请尝试indata.Substring(5,indata.Length-6)相反。这将获得从第5个索引到最后一个字符(只有一个字符)的所有字符。您是否阅读了文档?是否确定输入长度始终至少为5个字符?如果失败,请在调试或输出中运行它。(另外,您是否正在修剪空白?也许这就是将其丢弃的原因。您的初始值为长度5或更大,然后您将修剪以减少其长度。)@mafap好的,这是第四次,你需要找出什么是
inData
。你的代码不会用你提供的值抛出
ArgumentOutOfRangeException
。我以前遇到过这个问题。问题是子字符串是不友好的,它不使用智能。它完全按照你告诉它的去做,如果输入字符串太大或太小,会引发异常。哎呀,我忘记了字符串末尾的}括号。请尝试indata.Substring(5,indata.Length-6)相反。这将获得从第5个索引到最后一个字符的所有字符,但只有一个字符。对我来说,相当合理的逻辑对我来说相当合理,但现在已经解决了。正如我在上一篇评论中所说,这与
inData.Substring(5,inData.Length-8);
,inData至少等于
“{1112}\r\n”
。对于if-else语句,我使用了
inData.StartsWith(“some_text_15_ch”)
。是的,类似的,但现在已经解决了。正如我在上一篇评论中所说,这与
inData.Substring(5,inData.Length-8);
,inData至少等于
“{1112}\r\n”
。对于if-else语句,我使用了
inData.StartsWith(“一些文字”)