我遇到了一个有线问题,我正在使用 C# 的 protobuf-net 生成一个基于 Google Protocol Buffer 消息的文件,然后将其上传到我公司的一台服务器。
我在 C# 中创建了一个将 .proto 文件生成为 .cs 的工具,然后我使用它的类(来自 .cs 文件)来填充消息中的所有必填字段,然后我调用了 Serializer.Serialze() 函数它为我创建了请求的文件。
但是,这就是问题所在,我有另一个文件(相同的文件),它是在另一个用 C++ 编写的工具中创建的(使用与我使用的相同的 .proto 文件),但是当我尝试将我的文件上传到我们的服务器时我收到一个错误,表明有问题。
我将这两个文件与“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 文件中插入的字段是字符串,而 files(*.bin) 这里是字符串的示例:
“PowerMaster-30”
“JS702394 K17.A20”
ETC..
它们被插入到 .proto 文件中的大多数字符串字段中。
在文件字段 (.proto) 中,我正在加载我公司使用的二进制文件(与加载到 C++ 工具的文件相同)。
这是我正在从中读取数据的二进制文件的屏幕截图,在名为“Falsher.exe”的程序中打开,左侧转换为十六进制视图,右侧是 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);
有人可以帮我解释一下到底有什么区别以及它们发生的原因是什么?
谢谢!!
猎户座。