예제 #1
0
        public TPIHashReader(IServiceContainer ctx, byte[] hashData) : base(hashData)
        {
            TPIReader tpi  = ctx.GetService <TPIReader>();
            TPIHash   hash = tpi.Header.Hash;

            switch (hash.HashKeySize)
            {
            case sizeof(UInt16):
            case sizeof(UInt32):
                break;

            default:
                throw new InvalidDataException();
            }

            if (hash.TypeOffsets.Size > 0)
            {
                Position = hash.TypeOffsets.Offset;
                uint NumTiPairs = (uint)(hash.TypeOffsets.Size / Marshal.SizeOf <TIOffset>());
                for (int i = 1; i < NumTiPairs; i++)
                {
                    TIOffset tiOff = Read <TIOffset>();
                    TypeIndexToOffset.Add(tiOff.TypeIndex, tiOff.Offset);
                }
            }

            if (hash.HashValues.Size > 0)
            {
                Position = hash.HashValues.Offset;
                uint NumHashValues = hash.HashValues.Size / sizeof(UInt32);
                RecordHashValues = PerformAt(hash.HashValues.Offset, () => {
                    return(Enumerable.Range(1, (int)NumHashValues)
                           .Select(_ => ReadUInt32())
                           .ToArray());
                });
            }

            if (hash.HashHeadList.Size > 0)
            {
                Position             = hash.HashHeadList.Offset;
                NameIndexToTypeIndex = Deserializers.ReadMap <UInt32, UInt32>(this);
            }
        }
예제 #2
0
        public HashDataReader(TPIReader tpi, Stream stream) : base(stream)
        {
            TPIHash hash       = tpi.Header.Hash;
            uint    NumTiPairs = (uint)(hash.TypeOffsets.Size / Marshal.SizeOf <TPISlice>());

            PerformAt(hash.TypeOffsets.Offset, () => {
                for (int i = 1; i < NumTiPairs; i++)
                {
                    TIOffset tiOff = ReadStruct <TIOffset>();
                    TypeIndexToOffset.Add(tiOff.TypeIndex, tiOff.Offset);
                }
            });

            uint NumHashValues = (uint)(hash.HashValues.Size / sizeof(UInt32));

            RecordHashValues = PerformAt(hash.HashValues.Offset, () => {
                return(Enumerable.Range(1, (int)NumHashValues)
                       .Select(_ => ReadUInt32())
                       .ToArray());
            });
        }