2

有線の問題があります。C# 用の protobuf-net を使用して、Google Protocol Buffer メッセージに基づいてファイルを生成し、会社のサーバーの 1 つにアップロードしています。

.proto ファイルを .cs に生成するツールを C# で作成し、そのクラス (.cs ファイルから) を使用してメッセージのすべての必須フィールドに入力し、その後 Serializer.Serialze() 関数を呼び出しました。そして、要求されたファイルを作成します。

しかし、これが問題です。C++で記述された別のツールで作成された別のファイル(同じファイル)があります(使用したのと同じ.protoファイルを使用します)が、サーバーにファイルをアップロードしようとすると何かが間違っているというエラーが表示されます。

2 つのファイルを「Win Merge」ソフトウェアと比較したところ、C++ ツールで生成されたファイルと比較して、3 つの異なる行 (各ファイルの 7000 行以上) にほとんど違いがないことに気付きました。

Win Merge ツールからキャプチャされた 2 行の例を次に示します (左側が C++、右側が C#)。

ここに画像の説明を入力

もう一つの例:

違いは長方形(そこに何の意味があるのか​​ わかりません)にあり、その中にバイトがあることに気づきました...

私が使用している .proto ファイルは次のとおりです。

message Package {

message ArchDepend {

    message Arch {
        required string version = 1;
        required string description = 2;
    }

    message Firmware {
        required string version = 1;
        required string description = 2;
        required bytes file = 3;

        repeated string from_version = 4;
    }

    message Rsu {
        required string version = 1;
        required string description = 2;
        required bytes file = 3;
    }

    required Arch arch = 1;

    optional Firmware firmware = 2;
    optional Rsu rsu = 3;
}

message DefaultEeprom {
    required string version = 1;
    required string description = 2;
    required bytes file = 3;

    message Migration {
        required string from_version = 1;
        required bytes file = 2;
    }

    repeated Migration migrations = 4;
}

required string name = 1;
optional ArchDepend archDepend = 2;
optional DefaultEeprom defaultEeprom = 3;

}

.cs ファイルに挿入するフィールドは文字列であり、ファイル (*.bin) は文字列の例です。

「パワーマスター-30」

「JS702394 K17.A20」

等..

これらは、.proto ファイルのほとんどの文字列フィールドに挿入されます。

ファイル フィールド (.proto) に、会社が使用するバイナリ ファイル (C++ ツールに読み込まれたファイルと同じファイル) を読み込みます。

これは、「Falsher.exe」というプログラムで開かれた、データを読み取っているバイナリ ファイルのスクリーン ショットです。左側は 16 進ビューに変換され、右側は ASCII です。

ここに画像の説明を入力

そして、そのバイナリファイルを読み取るコードは次のとおりです。

       private string[] FindPanelVersionInBinFile(string path)
    {
        string currentline;
        int flag = 0;
        string[] namesArray = new string[3]; // contains all the strings which I get from the BIN file.

        using (StreamReader sr = new StreamReader(path))
        {
            while ((currentline = sr.ReadLine()) != null && flag < 3)
            {
                if (currentline.Contains("PRODUCT_FAMILY"))
                {
                    int index = currentline.IndexOf("PRODUCT_FAMILY");
                    namesArray[0] = currentline.Substring(index + 16, 14); // index of product family"PowerMaster-xx"
                    flag++;
                }
                if (currentline.Contains("SW_VERSION"))
                {
                    int index = currentline.IndexOf("SW_VERSION");
                    namesArray[1] = currentline.Substring(index + 12, 17); // index of software version "JSxxxxx Kxx.yyy"
                    flag++;                       
                }
                if (currentline.Contains("compatibility"))
                {
                    int index = currentline.IndexOf("compatibility");
                    namesArray[2] = currentline.Substring(index + 21, 7); // index of compatibility number "xx.yyy"
                    flag++;
                }                  
            }
        }
        return namesArray;

結局のところ、このコードを使用してファイルを生成しています。

                        byte[] data;
                        using (var ms = new MemoryStream())
                        {
                            Serializer.Serialize(ms, package);
                            data = ms.ToArray();
                        }
                        string packageFilePath = Path.Combine(savePath, package.Name);
                        File.WriteAllBytes(packageFilePath, data);

正確には何が違いで、どのような理由で起こったのかを説明してくれる人がいますか?

ありがとうございました!!

オリオン。

4

1 に答える 1