1

我正在开发一个用于读取 CD-ROM 和 ISO9660 文件系统的库。

长话短说,除了一件事我很难弄清楚它是如何完成的之外,几乎所有东西都在工作:

XA 标准在哪里定义了 Mode 2 Form 1 与 Mode 2 Form 2 之间的区别?

目前,我正在使用以下伪代码来区分这两种形式;尽管这是一种幼稚的启发式方法,但它确实有效,但效果很好,远非理想:

var buffer = ... // this is a raw sector of 2352 bytes
var m2F1   = ISector.Cast<SectorMode2Form1>(buffer);
var edc1   = EdcHelper.ComputeBlock(0, buffer, 16, 2056);
var edc2   = BitConverter.ToUInt32(m2F1.Edc, 0);
var isM2F1 = edc1 == edc2;
if (isM2F1) return CdRomSectorMode.Mode2Form1;

// NOTE we cannot reliably check EDC of M2F2 since it's optional
var isForm2 =
    m2F1.SubHeaderCopy1.SubMode.HasFlag(SectorMode2Form1SubHeaderSubMode.Form2) &&
    m2F1.SubHeaderCopy2.SubMode.HasFlag(SectorMode2Form1SubHeaderSubMode.Form2);
if (isForm2) return CdRomSectorMode.Mode2Form2;

return CdRomSectorMode.Mode2Formless;

如果您查看 IsoBuster 之类的软件,它似乎是轨道级别的属性,但是,我无法理解从轨道中读取值的位置。

4

0 回答 0