2

私はVB6っぽい人ではありません。私たちのプロジェクトのために、いくつかのコードを 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 に向かう文字列を取得していて、それをデコードする必要があります。どうもありがとうございました!

4

3 に答える 3

2
Comm_ReceiveData = Comm_ReceiveData.Substring(1);

トリックを行う必要があります。Substring部分文字列の開始位置のみを必要とする 1 つの引数のバージョンがあります。

于 2013-08-27T23:18:51.573 に答える
2

Mid$ 関数は、指定された長さまで返します。長さよりも文字数が少ない場合は、文字列の開始位置から末尾までの文字数を (エラーなしで) 返します。あなたが示すVB6コードは、Mid $の特定の動作をかなりずさんに数えており、長さパラメータを完全に省略した場合にMid $が同じように動作するため、不要です。このページの説明: http://www.thevbprogrammer.com/Ch04/04-08-StringFunctions.htm

したがって、C# のリテラルに相当するものは次のようになります。

Comm_ReceiveData = Comm_ReceiveData.Substring(1, Comm_ReceiveData.Length-1);

しかし、FrankPlの答えには、使用するのがより理にかなっている Substring のバリアントがあります。

于 2013-08-27T23:37:45.263 に答える
0

Mid$ は、可能な限り最良の部分文字列を返すか、ソース文字列を返すことにより、範囲外のエラーを丁寧に処理します。

このメソッドは、VB6 for 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;
}
于 2013-08-30T14:46:56.077 に答える