所有
我很难处理二进制数据。
我正在研究MSDN的一些代码。
服务器端:
string fileName = "AppSettings.dat";
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
我从服务器收到了二进制文件。
string clientFile = "AppSettings.dat";
using (BinaryReader reader = new BinaryReader(File.Open(clientFile, FileMode.Open)))
{
float aspectRatio = reader.ReadSingle();
string tempDirectory = reader.ReadString();
int autoSaveTime = reader.ReadInt32();
bool showStatusBar = reader.ReadBoolean();
}
使用BinaryWriter和BinaryReader类时,读起来很容易。
但是,这是我的问题。
服务器开发人员离开了公司,不知怎的,任何人都无法与他联系。
我无法弄清楚他是如何写信给BinaryWriter的。
我指的是确切的顺序。
在示例中,我必须按顺序阅读阅读器
ReadSingle
ReadString
ReadInt32
ReadBoolean
然后我可以得到正确的结果。
但在我的情况下,我不知道确切的顺序。
所以,我可以尝试的是如何一次读取所有字符和数字。
像......
string contents = reader.someMethod;
然后内容如下:
1.250F
c:\Temp
10
true
回车是可以跳过的。
修改
我尝试过File.ReadAllBytes。
但结果并非我期望的结果......
byte[] bytes = System.IO.File.ReadAllBytes(clientFile);
string contents = Encoding.UTF8.GetString(bytes);
\ 0 \ 0 \交流?:\温度\ n \ 0 \ 0 \ 0
答案 0 :(得分:2)
我担心不知道正确的顺序;然后你将很难解决这个问题。
我建议使用.net反编译器来读取他的代码。我假设代码归贵公司所有,所以这可能没有错。
RedGates反射器和Resharper都具有将.net程序集反编译为C#的功能。
还有一个免费的来自Telerik的'dotPeek',我被告知它非常好但我自己没有用过。
基本上你只是运行程序并给它组装,你可以浏览源代码,只要它没有被混淆;但即便如此 - 有些操作无法完全混淆,例如binaryWriter.Write,因为它们必须按特定顺序发生。
如果这不是您所需要的,请尝试澄清您的问题!
希望这有帮助。
答案 1 :(得分:2)
下面的代码写入一个二进制文件,然后将其读入一个字节数组并输出十六进制值。
using (var writer = new BinaryWriter(File.Create("foo.bin")))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
var bytes = File.ReadAllBytes("foo.bin");
var text = BitConverter.ToString(bytes);
Console.WriteLine(text);
这是输出:
00-00-A0-3F-07-63-3A-5C-54-65-6D-70-0A-00-00-00-01
解码,我们有:
0000A03f - 4 bytes = 1.250F
接下来是对应于字符串“c:\ Temp”的8个字节。第一个字节07
是长度。 BinaryWriter
对长度使用7位编码方案,因此短于128字节的字符串只需要一个长度字节。组成字符串的7个字符遵循长度字节。
之后你有四个字节0A000000
,它是整数10。
最后,你有值1,这是布尔值True。
您应该使用BitConverter.ToString(bytes)
输出文件中的数据。然后你可以直接检查字节。
如果您对文件中的内容有所了解,通常可以解决它。字符串很容易被挑选出来,你可以经常使用它们作为锚点来弄清楚它们两侧的内容。如果您了解文件中的内容并且只是想弄清楚事物的编写顺序,则尤其如此。
你真的不需要一个反编译器来弄清楚他写的东西的顺序。你可以使用ildasm.exe来检查生成的MSIL。对BinaryWriter.Write
的函数调用很容易发现,反汇编的代码会告诉你它是在写一个字符串,布尔,整数等。对于一次性的事情,这就是我要去的方式。如果我有一份更大的工作需要理解很多代码,我会选择一个更好的反编译器。