Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }