C# Substring方法(Int32,Int32)抛出ArgumentOutOfRangeException
我有一个字符串,其中前5个字符从不为空,从char 6到end data是变量leght。大概是这样的: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
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(“一些文字”)
。