public unsafe bool Check(byte[] fileimage) { if (this.TagName == "head") fixed(byte *img = &fileimage[0]) { // reset checkSumAdjustment headTable *head = (headTable *)(img + (uint)this.offset); ULONG csa = head->checkSumAdjustment; head->checkSumAdjustment = (ULONG)0; bool ret = this.CalculateTableSum(fileimage) == (uint)this.checkSum; // Check checkSumAdjustment OffsetTable * offset = (OffsetTable *)img; TableDirectoryEntry *entry = (TableDirectoryEntry *)(offset + 1); TableDirectoryEntry *end = entry + (uint)offset->numTables; uint sum = (uint)offset->Sum; for (; entry < end; entry++) { sum += entry->Sum; sum += (uint)entry->checkSum; } // restore checkSumAdjustment head->checkSumAdjustment = csa; return(ret); //&&sum==0xB1B0AFBA-(uint)csa; } return(this.CalculateTableSum(fileimage) == (uint)this.checkSum); }
public bool Read() { Program.ErrorOut.WriteLine("TTF ファイル '{0}' を読み込みます。", path); Program.ErrorOut.AddIndent(); try{ if (!System.IO.File.Exists(path)) { Program.ErrorOut.WriteLine("読み込もうとしたファイルは存在しませんので読み込む事は出来ません", path); return(false); } this.image = System.IO.File.ReadAllBytes(this.path); //-- TableDirectoryEntries の読込 unsafe { fixed(byte *img = &this.image[0]) { OffsetTable *header = (OffsetTable *)img; if (!header->Check()) { Program.ErrorOut.WriteLine("ファイルヘッダに異常がありましたので読込を中止します。"); return(false); } TableDirectoryEntry *entry = (TableDirectoryEntry *)(header + 1); TableDirectoryEntry *mEntry = entry + (ushort)header->numTables; while (entry < mEntry) { this.tables[entry->TagName] = *entry; if (!entry->Check(image)) { Program.ErrorOut.WriteLine("表 '{0}' の checkSum が合いません", entry->TagName); } entry++; } } } }finally{ Program.ErrorOut.RemoveIndent(); } return(true); }
public unsafe bool Check(byte[] fileimage) { if (this.TagName == "head") fixed(byte *img = &fileimage[0]) { // reset checkSumAdjustment headTable *head = (headTable *)(img + (uint)this.offset); ULONG csa = head->checkSumAdjustment; head->checkSumAdjustment = (ULONG)0; uint csaR = 0xB1B0AFBA - (uint)csa; bool ret = this.CalculateTableSum(fileimage) == (uint)this.checkSum; // Check checkSumAdjustment OffsetTable * offset = (OffsetTable *)img; TableDirectoryEntry *entry = (TableDirectoryEntry *)(offset + 1); TableDirectoryEntry *end = entry + (uint)offset->numTables; uint sum = (uint)offset->Sum; for (; entry < end; entry++) { sum += entry->Sum; sum += (uint)entry->checkSum; } uint sum2 = this.SumEntireFont(fileimage); // restore checkSumAdjustment head->checkSumAdjustment = csa; if (sum != sum2) { System.Console.WriteLine("checkSums of all the structures and the entire file are diffrent from each other."); if (sum == csaR) { System.Console.WriteLine("checkSumAdjustment is calculated from all the structures."); } else if (sum2 == csaR) { System.Console.WriteLine("checkSumAdjustment is calculated from the entire file."); } else { System.Console.WriteLine("Neither structures nor entire file is used to calculate checkSumAdjustment: 0x{0:X8}", csaR); } } else { if (sum != csaR) { System.Console.WriteLine("checkSumAdjustment is unexpected value: 0x{0:X8}", csaR); } } System.Console.WriteLine("Σ1: 0x{0:X8}; checkSumAdjustment: 0x{1:X8}", sum, csaR); System.Console.WriteLine("Σ2: 0x{0:X8}; checkSumAdjustment: 0x{1:X8}", sum2, csaR); System.Console.WriteLine("Σ1 〜 checkSumAdjustment: 0x{0:X8} / 0x{1:X8}", csaR - sum, sum - csaR); System.Console.WriteLine("Σ2 〜 checkSumAdjustment: 0x{0:X8} / 0x{1:X8}", csaR - sum2, sum2 - csaR); return(ret); } return(this.CalculateTableSum(fileimage) == (uint)this.checkSum); }