public static HFSDataRecord Read(ref ReadOnlySpan <byte> data, int size, HFSTreeHeaderRecord headerRecord, bool isHFSX) { bool isBigKey = headerRecord.Attributes.HasFlag(HFSTreeAttributes.BigKeys); ushort keyLength = isBigKey ? ReadUInt16(ref data) : ReadUInt8(ref data); int keySize = (isBigKey ? 2 : 1) + keyLength; size -= keySize; var key = new byte[keyLength]; data.Slice(0, keyLength).CopyTo(key); data = data.Slice(keyLength); // data is always aligned to 2 bytes if (keySize % 2 == 1) { data = data.Slice(1); size--; } var structData = new byte[size]; data.Slice(0, size).CopyTo(structData); data = data.Slice(size); return(new HFSDataRecord(key, structData, headerRecord.KeyCompareType, isHFSX)); }
public static HFSPointerRecord Read(ref ReadOnlySpan <byte> data, HFSTreeHeaderRecord headerRecord, bool isHFSX) { bool isBigKey = headerRecord.Attributes.HasFlag(HFSTreeAttributes.BigKeys); ushort keyLength = isBigKey ? ReadUInt16(ref data) : ReadUInt8(ref data); if (!headerRecord.Attributes.HasFlag(HFSTreeAttributes.VariableIndexKeys)) { keyLength = headerRecord.MaxKeyLength; } int keySize = (isBigKey ? 2 : 1) + keyLength; var key = new byte[keyLength]; data.Slice(0, keyLength).CopyTo(key); data = data.Slice(keyLength); // data is always aligned to 2 bytes if (keySize % 2 == 1) { data = data.Slice(1); } uint nodeNumber = ReadUInt32(ref data); return(new HFSPointerRecord(key, nodeNumber, headerRecord.KeyCompareType, isHFSX)); }