public PalmFile(Stream stream, bool leaveOpen = false) { EndiannessAwareBinaryReader r = null; var baseDate = new DateTime(1904, 1, 1); try { r = new EndiannessAwareBinaryReader(stream, EndiannessAwareBinaryReader.Endianness.Big); Name = new string(r.ReadChars(32)); Attributes = r.ReadUInt16(); Version = r.ReadUInt16(); CreationDate = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0); ModificationDate = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0); LastBackupDate = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0); ModificationNumber = r.ReadUInt32(); AppInfoID = r.ReadUInt32(); SortInfoID = r.ReadUInt32(); Type = new string(r.ReadChars(4)); Creator = new string(r.ReadChars(4)); UniqueIDSeed = r.ReadUInt32(); NextRecordListID = r.ReadUInt32(); var numberOfRecords = r.ReadUInt16(); RecordInfos = new PalmRecordInfo[numberOfRecords]; Records = new PalmRecord[numberOfRecords]; for (var i = 0; i < numberOfRecords; i++) { RecordInfos[i].DataOffset = r.ReadUInt32(); var info = r.ReadBytes(4); RecordInfos[i].Attributes = info[0]; info[0] = 0; RecordInfos[i].UniqueID = BytesToUint(info); } r.ReadUInt16(); // Unknown value for (var i = 0; i < numberOfRecords; i++) { var start = RecordInfos[i].DataOffset; var end = i < numberOfRecords - 1 ? RecordInfos[i + 1].DataOffset : r.BaseStream.Length; var length = ((int)(end - start)); Records[i].Data = r.ReadBytes(length); } var header = new EndiannessAwareBinaryReader(new MemoryStream(Records[0].Data), EndiannessAwareBinaryReader.Endianness.Big); Compression = header.ReadUInt16(); header.ReadUInt16(); // Unknown value TextLength = header.ReadUInt32(); TextRecordCount = header.ReadUInt16(); TextRecordSize = header.ReadUInt16(); CurrentPosition = header.ReadUInt16(); } finally { if (!leaveOpen) { r?.Close(); r?.Dispose(); stream?.Close(); stream?.Dispose(); } } }