有線の問題があります。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);
正確には何が違いで、どのような理由で起こったのかを説明してくれる人がいますか?
ありがとうございました!!
オリオン。