我不是VB6-ish的人。我只需要为我们的项目将一些代码从VB6转换为C#。 我在VB6上有这个代码
Comm_ReceiveData = Mid$(Comm_ReceiveData, 2, Len(Comm_ReceiveData))
此代码位于Timer1_Timer()
子功能。
我将此行转换为C#
Comm_ReceiveData = Comm_ReceiveData.Substring(1, Comm_ReceiveData.Length);
所以在C#中,我收到了这个错误。
Index and length must refer to a location within the string.
字符串Comm_ReceiveData是“01BP215009010137 \ r”。我相信,长度是17
是的,我知道我会在C#中遇到这种错误。我想知道为什么我不会在VB6上出错。 有没有其他方法将VB6代码转换为C#?那个VB6代码对“越界”的错误不敏感吗?
顺便说一下,我正在使用该代码进行串行通信。我从我的arduino到C#/ VB6得到一个字符串,我需要解码它。非常感谢你!
答案 0 :(得分:2)
Comm_ReceiveData = Comm_ReceiveData.Substring(1);
应该做的伎俩。 Substring
有一个单参数版本,只需要子字符串的起始位置。
答案 1 :(得分:2)
Mid $函数返回指定的长度。如果字符数少于长度,则返回(没有错误)从字符串的起始位置到结尾的字符。您显示的VB6代码相当粗略地依赖于Mid $的特定行为,并且因为如果他们刚刚完全省略了length参数,则Mid $会表现相同。本页说明:http://www.thevbprogrammer.com/Ch04/04-08-StringFunctions.htm
因此C#中的字面值相当于
Comm_ReceiveData = Comm_ReceiveData.Substring(1, Comm_ReceiveData.Length-1);
但FrankPl的回答是使用了更有意义的子串的变体。
答案 2 :(得分:0)
Mid $通过返回尽可能最好的子字符串或者返回源字符串来优雅地处理越界错误。
此方法从VB6为C#重现Mid $函数的行为。
/// <summary>
/// Function that allows for substring regardless of length of source string (behaves like VB6 Mid$ function)
/// </summary>
/// <param name="s">String that will be substringed</param>
/// <param name="start">start index (0 based)</param>
/// <param name="length">length of desired substring</param>
/// <returns>Substring if valid, otherwise returns original string</returns>
public static string Mid(string s, int start, int length)
{
if (start > s.Length || start < 0)
{
return s;
}
if (start + length > s.Length)
{
length = s.Length - start;
}
string ret = s.Substring(start, length);
return ret;
}