所以我正在阅读一个TrueType字体文件,并因各种原因解析表格,我不会在这里讨厌你。
我目前对'head'表校验和值感到困惑;我遵循规范,将'checkSumAdjustment'设置为0,计算整个文件的校验和,并从0xB1B0AFBA中减去结果,如下所示:
private UInt32 CalculateFileChecksum(EndianBinaryReader reader, UInt32 streamOffset)
{
var pos = reader.BaseStream.Position; //save current position
reader.BaseStream.Position = 0;
UInt32 sum = 0;
var nLongs = ((reader.BaseStream.Length + 3) & ~3) / 4; //get number of longs (but really uints) to read
var skipPos = streamOffset + 12; //checksumAdjustment position
while (nLongs-- > 0)
if (reader.BaseStream.Position == skipPos)
reader.BaseStream.Position += 4; //skip the checksumAdjustment value.
else
sum += reader.ReadUInt32();
reader.BaseStream.Position = pos; //restore stream position
return 0xB1B0AFBA - sum; //as per spec
}
这个ALWAYS的最终结果等于'magicNumber'字段(1594834165或0x5F0F3CF5)。
我的问题很简单:
这是对的吗?
如果是这样,任何人都可以解释我是如何获得神奇数字的吗?
如果没有,我做错了什么?
提前致谢!