验证TrueType字体' head'表校验和

时间:2014-09-17 12:07:29

标签: c# true-type-fonts

所以我正在阅读一个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)。

我的问题很简单:

这是对的吗?

如果是这样,任何人都可以解释我是如何获得神奇数字的吗?

如果没有,我做错了什么?

提前致谢!

0 个答案:

没有答案