public HFSVolumeHeader(
     bool isHFSX,
     ushort version,
     uint attributes,
     uint lastMountedVersion,
     uint journalInfoBlock,
     DateTime createDate,
     DateTime modifyDate,
     DateTime backupDate,
     DateTime checkedDate,
     uint fileCount,
     uint folderCount,
     uint blockSize,
     uint totalBlocks,
     uint freeBlocks,
     uint nextAllocation,
     uint rsrcClumpSize,
     uint dataClumpSize,
     uint nextCatalogID,
     uint writeCount,
     ulong encodingsBitmap,
     IReadOnlyList <uint> finderInfo,
     HFSForkData allocationFile,
     HFSForkData extentsFile,
     HFSForkData catalogFile,
     HFSForkData attributesFile,
     HFSForkData startupFile)
 {
     IsHFSX             = isHFSX;
     Version            = version;
     Attributes         = attributes;
     LastMountedVersion = lastMountedVersion;
     JournalInfoBlock   = journalInfoBlock;
     CreateDate         = createDate;
     ModifyDate         = modifyDate;
     BackupDate         = backupDate;
     CheckedDate        = checkedDate;
     FileCount          = fileCount;
     FolderCount        = folderCount;
     BlockSize          = blockSize;
     TotalBlocks        = totalBlocks;
     FreeBlocks         = freeBlocks;
     NextAllocation     = nextAllocation;
     RsrcClumpSize      = rsrcClumpSize;
     DataClumpSize      = dataClumpSize;
     NextCatalogID      = nextCatalogID;
     WriteCount         = writeCount;
     EncodingsBitmap    = encodingsBitmap;
     FinderInfo         = finderInfo;
     AllocationFile     = allocationFile;
     ExtentsFile        = extentsFile;
     CatalogFile        = catalogFile;
     AttributesFile     = attributesFile;
     StartupFile        = startupFile;
 }
        public static bool TryRead(Stream stream, out HFSVolumeHeader?header)
        {
            header = null;
            stream.Skip(1024); // reserved bytes

            bool   isHFSX;
            ushort sig = ReadUInt16(stream);

            if (sig == SignaturePlus)
            {
                isHFSX = false;
            }
            else if (sig == SignatureX)
            {
                isHFSX = true;
            }
            else
            {
                return(false);
            }

            ushort               version            = ReadUInt16(stream);
            uint                 attributes         = ReadUInt32(stream);
            uint                 lastMountedVersion = ReadUInt32(stream);
            uint                 journalInfoBlock   = ReadUInt32(stream);
            DateTime             createDate         = ReadDate(stream);
            DateTime             modifyDate         = ReadDate(stream);
            DateTime             backupDate         = ReadDate(stream);
            DateTime             checkedDate        = ReadDate(stream);
            uint                 fileCount          = ReadUInt32(stream);
            uint                 folderCount        = ReadUInt32(stream);
            uint                 blockSize          = ReadUInt32(stream);
            uint                 totalBlocks        = ReadUInt32(stream);
            uint                 freeBlocks         = ReadUInt32(stream);
            uint                 nextAllocation     = ReadUInt32(stream);
            uint                 rsrcClumpSize      = ReadUInt32(stream);
            uint                 dataClumpSize      = ReadUInt32(stream);
            uint                 nextCatalogID      = ReadUInt32(stream);
            uint                 writeCount         = ReadUInt32(stream);
            ulong                encodingsBitmap    = ReadUInt64(stream);
            IReadOnlyList <uint> finderInfo         = ReadFinderInfo(stream);
            HFSForkData          allocationFile     = HFSForkData.Read(stream);
            HFSForkData          extentsFile        = HFSForkData.Read(stream);
            HFSForkData          catalogFile        = HFSForkData.Read(stream);
            HFSForkData          attributesFile     = HFSForkData.Read(stream);
            HFSForkData          startupFile        = HFSForkData.Read(stream);

            header = new HFSVolumeHeader(
                isHFSX,
                version,
                attributes,
                lastMountedVersion,
                journalInfoBlock,
                createDate,
                modifyDate,
                backupDate,
                checkedDate,
                fileCount,
                folderCount,
                blockSize,
                totalBlocks,
                freeBlocks,
                nextAllocation,
                rsrcClumpSize,
                dataClumpSize,
                nextCatalogID,
                writeCount,
                encodingsBitmap,
                finderInfo,
                allocationFile,
                extentsFile,
                catalogFile,
                attributesFile,
                startupFile);

            return(true);
        }