- 已编辑
我在看 digest 包里的这行代码时,发现一个来源不甚明确的魔法数字 14,我很好奇为什么是丢弃 serialize() 的前 14 位。我简单跑了几个例子,感觉应该是 17:
> serialize(NULL, NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 fe
> serialize('a', NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 04 00 09 00 00 00 01 61
> serialize('\n', NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 04 00 09 00 00 00 01 0a
> serialize(TRUE, NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0a 00 00 00 01 00 00 00 01
> serialize(NA_character_, NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 10 00 00 00 01 00 00 00 09 ff ff ff ff
> serialize(1, NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0e 00 00 00 01 3f f0 00 00 00 00 00 00
> serialize(1:10, NULL)
[1] 58 0a 00 00 00 02 00 03 04 03 00 02 03 00 00 00 00 0d 00 00 00 0a 00 00 00 01 00 00 00 02 00 00 00
[34] 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00 0a
这些不同对象的前 17 位似乎都是一样的。它们具体存储着什么信息我不是很清楚,理论上有个版本信息(serialize() 函数有个 version 参数),不知谁能给我“解码”一下。我估计得看 R 的源代码,凭我有限的阅读理解能力,只能找到这里了,这些代码是什么意思,我也不懂。
第一位 58
应该是字符 X
,表示二进制数据(A
表示 ASCII 数据,在 ?serialize
帮助文档中略有提及),0a
是换行符 \n
,剩下的我两眼完全懵圈。
又及:15、16、17 都是 null 字符,应该是可以丢弃的吧。