예제 #1
0
        internal DatFile(IFile source, DatSpecification specification, DatFileIndex index,
                         bool lazyLoad = true)
        {
            _source = source;
            _spec   = specification;
            _idx    = index;

            if (!lazyLoad)
            {
                Load();
            }
        }
예제 #2
0
        public DatRow(ref Span <byte> rowData, ref Span <byte> data,
                      DatSpecification specification, DatFileIndex index)
        {
            Underlying = new Dictionary <string, DatValue>();
            var offset = 0;

            foreach (var field in specification.Fields)
            {
                var k = field.Key;
                var v = field.Value;

                object value;
                if (v.ClrType.IsReference)
                {
                    int dataOffset;

                    if (v.ClrType.IsList)
                    {
                        var elements = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;
                        dataOffset = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;

                        value = ReadList(v.ClrType.DefinedType, dataOffset,
                                         elements, ref data);
                    }
                    else
                    {
                        dataOffset = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;

                        if (v.ClrType.DefinedType == typeof(string))
                        {
                            if (dataOffset > data.Length)
                            {
                                continue;
                            }

                            var length = data.Slice(dataOffset).IndexOf(StringNullTerminator);
                            if (length % 2 != 0)
                            {
                                length++;
                            }

                            value = data.Slice(dataOffset, length).ToUnicodeText();
                        }
                        else
                        {
                            value = data.Slice(dataOffset, SizeTable[v.ClrType.DefinedType])
                                    .To(v.ClrType.DefinedType);
                        }
                    }
                }
                else
                {
                    var size = SizeTable[v.ClrType.DefinedType];
                    value   = rowData.Slice(offset, size).To(v.ClrType.DefinedType);
                    offset += size;
                }

                var datValue = new DatValue(v, value, index);
                Underlying.Add(k, datValue);
            }
        }