【发布时间】:2018-04-30 04:29:42
【问题描述】:
我正在使用下面显示的函数将不同类型的不同变量转换为字节数组。
public static byte[] ObjectToByteArray(Object obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
static void Main(string[] args)
{
various_types a = default(current_type);
byte[] bytearray = ObjectToByteArray(a);
Console.WriteLine(bytearray);
}
对于字节 a = 0;
0 1 0 0 0 255 255 255 255 1 0 0 0 0 0 0 0 4 1 0 0 0 11 83 121 115 116 101 109 46 66 121 116 101 1 0 0 0 7 109 95 118 97 108 117 101 0 2 0 11
对于字节 a = 255;
0 1 0 0 0 255 255 255 255 1 0 0 0 0 0 0 0 4 1 0 0 0 11 83 121 115 116 101 109 46 66 121 116 101 1 0 0 0 7 109 95 118 97 108 117 101 0 2 255 11
不同的只是最后一个字节旁边的字节 - 变量的值存储在那里。其余的都是一样的。所有其他类型也是如此;一组相同的字节(似乎大约 50 个 - 'byte' 类型有 49 个相同的字节,'int' 类型有 50 个,'ulong' 类型有 51 个),然后是几个字节存储实际值,一个字节结束它(11 是我检查的所有类型的结束字节)。
其他字节包含什么信息?
【问题讨论】:
-
十六进制转储中还有很多与变量类型无关的内容。 BinaryFormatter 添加一个文件头并包括类型的类型声明和存储值的字段。当您使用一个体面的十六进制查看器时更明显,该查看器还向您显示字节值的 ascii 文本。否则一个字节有一个非常简单的表示,它只需要一个字节。
-
@HansPassant 谢谢。我在哪里可以收集到这些知识(你从哪里知道的)?我在 MSDN 上看不到任何类似的东西,谷歌搜索也没有发现,至少乍一看是这样。
-
我对其进行了逆向工程,首先想知道 BinaryFormatter 如何能够检测程序集版本和类更改,然后像您一样查看十六进制转储并阅读 BinaryFormatter 源代码。像 SO 这样的网站是避免花费这种时间的一种相当不错的方式。
-
@JohnSmith 看看这里:msdn.microsoft.com/en-us/library/cc236844.aspx。这是 BinaryFormatter 的规范
标签: c# serialization