private static IEnumerable <TableFieldDescriptor> LoadInteral(TableHeader header, BinaryReader reader) { reader.BaseStream.Seek(TableHeader.Size + header.FieldDescriptionOffset, SeekOrigin.Begin); for (var x = 0; x < header.FieldDescriptionCount; x++) { var next = LoadSingle(reader); yield return(next); } }
public static WildstarTableRow Load(TableHeader header, List <TableFieldDescriptor> descriptors, int rowNumber, BinaryReader reader) { List <WildstarTableColumn> columns = new List <WildstarTableColumn>(); foreach (var column in descriptors) { var dataColumn = WildstarTableColumn.Load(header, rowNumber, column, reader); columns.Add(dataColumn); } return(new WildstarTableRow { Columns = columns }); }
public static TableHeader FromReader(BinaryReader reader) { var magic = reader.ReadUInt32(); if (magic != ExpectedMagic) { throw new InvalidDataException($"Expecting signature {ExpectedMagic:X8}, but got {magic:X8}"); } var ret = new TableHeader { Magic = magic, Version = reader.ReadInt32(), TableNameLength = reader.ReadInt64(), Unknown1 = reader.ReadInt64(), RecordSize = reader.ReadInt64(), FieldDescriptionCount = reader.ReadInt64(), FieldDescriptionOffset = reader.ReadInt64(), EntryCount = reader.ReadInt64(), EntryBlockSize = reader.ReadInt64(), EntryBlockOffset = reader.ReadInt64(), MaxEntry = reader.ReadInt64(), IdLookupOffset = reader.ReadInt64(), Unknown2 = reader.ReadInt64() }; // We don't want the null character, hence the -1. ret.TableName = Encoding.Unicode.GetString(reader.ReadBytes(((int)ret.TableNameLength - 1) * 2)); //uint64 offset = mFieldDescs.size() * sizeof(FieldDescEntry) + mHeader.ofsFieldDesc + 0x60; //if (offset % 16) //{ // offset += 16 - (offset % 16); //} ret.DataOffset = (ret.FieldDescriptionCount * TableFieldDescriptor.Size) + Size + ret.FieldDescriptionOffset; if (ret.DataOffset % 16 != 0) { ret.DataOffset += 16 - (ret.DataOffset % 16); } return(ret); }
public static WildstarTableColumn Load(TableHeader header, int rowNumber, TableFieldDescriptor column, BinaryReader reader) { var ret = new WildstarTableColumn(); var offset = TableHeader.Size + (header.RecordSize * rowNumber) + header.EntryBlockOffset + column.RowOffset; reader.BaseStream.Seek(offset, SeekOrigin.Begin); switch (column.FieldType) { case FieldType.Bool: var val = reader.ReadUInt32(); ret.Value = val != 0; break; case FieldType.Float: ret.Value = reader.ReadSingle(); break; case FieldType.UInt32: ret.Value = reader.ReadUInt32(); break; case FieldType.UInt64: ret.Value = reader.ReadUInt64(); break; case FieldType.StringTableOffset: // wat? //var data = //var entryOffset = data & 0x00000000FFFFFFFF; var lowOffset = reader.ReadUInt32(); var highOffset = reader.ReadUInt32(); if (lowOffset > 0) { highOffset = lowOffset; //var nextByte = reader.ReadInt32(); } // TODO var stringTableOffset = header.EntryBlockOffset + TableHeader.Size + (long)highOffset; if (stringTableOffset < reader.BaseStream.Length) { reader.BaseStream.Seek(stringTableOffset, SeekOrigin.Begin); using ( var stringReader = new StreamReader(reader.BaseStream, Encoding.Unicode, false, 1024, true)) { StringBuilder valueBuilder = new StringBuilder(); while (true) { var next = stringReader.Read(); if (next == 0 || next == -1) { break; } valueBuilder.Append((char)next); } ret.Value = valueBuilder.ToString(); } } else { ret.Value = null; } break; } return(ret); }
private TableHeader LoadHeader() { using (var binaryReader = new BinaryReader(_stream, Encoding.Unicode, true)) return(TableHeader.FromReader(binaryReader)); }