private void ReadTypeDescriptors(Stream s) { typeDescriptors = new List <StreamingPartitionTypeDescriptor>(); for (int i = 0; i < Header.typeDescriptorCount; i++) { StreamingPartitionTypeDescriptor f = new StreamingPartitionTypeDescriptor(); f.typeNameHash = Helpers.ReadInt(s); foreach (KeyWordDicStruct key in keyWordDic) { if (key.hash == f.typeNameHash) { f._name = key.keyword; break; } } f.layoutDescriptorIndex = Helpers.ReadInt(s); f.fieldCount = (byte)s.ReadByte(); f.alignment = (byte)s.ReadByte(); f.typeFlags = Helpers.ReadUShort(s); f._type = (byte)((f.typeFlags >> 4) & 0x1F); f.instanceSize = Helpers.ReadUShort(s); f.secondaryInstanceSize = Helpers.ReadUShort(s); f._index = i; typeDescriptors.Add(f); } }
private Field ReadField(Stream s, int idx) { Field res = new Field(); res.Descriptor = fieldDescriptors[idx]; List <Field> list; byte[] buff; res.offset = s.Position; switch (res.Descriptor._type) { case 0: case 2: res.data = ReadType(s, res.Descriptor.fieldTypeIndex); break; case 3: uint u = Helpers.ReadUInt(s); res.data = u; break; case 4: int index = Helpers.ReadInt(s); list = new List <Field>(); if (index < 0) { res.data = list; break; } long pos = s.Position; s.Seek(Header._arraySectionstart + arrayList[index].offset, 0); StreamingPartitionTypeDescriptor tp = typeDescriptors[arrayList[index].typeDescriptorIndex]; for (int i = 0; i < arrayList[index].elementCount; i++) { list.Add(ReadField(s, tp.layoutDescriptorIndex)); } s.Seek(pos, 0); res.data = list; break; case 7: int offset = Helpers.ReadInt(s); if (offset == -1) { res.data = ""; break; } stbl.Seek(offset, 0); res.data = Helpers.ReadNullString(stbl); break; case 8: offset = Helpers.ReadInt(s); StreamingPartitionTypeDescriptor cdesc = typeDescriptors[res.Descriptor.fieldTypeIndex]; string value = ""; if (cdesc.fieldCount != 0) { for (int i = cdesc.layoutDescriptorIndex; i < cdesc.layoutDescriptorIndex + cdesc.fieldCount; i++) { if (fieldDescriptors[i].fieldOffset == offset) { value = fieldDescriptors[i]._name; break; } } } res.data = value; break; case 0xa: case 0xb: case 0xc: res.data = (byte)s.ReadByte(); break; case 0xd: case 0xe: res.data = Helpers.ReadUShort(s); break; case 0xf: case 0x10: res.data = Helpers.ReadUInt(s); break; case 0x13: res.data = Helpers.ReadFloat(s); break; case 0x11: case 0x12: case 0x14: res.data = Helpers.ReadULong(s); break; case 0x15: buff = new byte[0x10]; s.Read(buff, 0, 0x10); res.data = buff; break; case 0x16: buff = new byte[0x14]; s.Read(buff, 0, 0x14); res.data = buff; break; case 0x17: break; default: break; } return(res); }
private void ReadTypeDescriptors(Stream s) { typeDescriptors = new List<StreamingPartitionTypeDescriptor>(); for (int i = 0; i < Header.typeDescriptorCount; i++) { StreamingPartitionTypeDescriptor f = new StreamingPartitionTypeDescriptor(); f.typeNameHash = Helpers.ReadInt(s); foreach (KeyWordDicStruct key in keyWordDic) if (key.hash == f.typeNameHash) { f._name = key.keyword; break; } f.layoutDescriptorIndex = Helpers.ReadInt(s); f.fieldCount = (byte)s.ReadByte(); f.alignment = (byte)s.ReadByte(); f.typeFlags = Helpers.ReadUShort(s); f._type = (byte)((f.typeFlags >> 4) & 0x1F); f.instanceSize = Helpers.ReadUShort(s); f.secondaryInstanceSize = Helpers.ReadUShort(s); f._index = i; typeDescriptors.Add(f); } }