private FileInfoBTree[] LoadFileInfoBTree(EndianBinReader reader, uint offset) { reader.BaseStream.Seek(offset, System.IO.SeekOrigin.Begin); byte childCount = reader.ReadByte(); uint childOffset = reader.Read3BytesUInt32(); uint nodeCount = reader.ReadUInt16(); uint dataOffset = offset + 4 + 2; var objects = new FileInfoBTree[0]; uint indexer = 0; for (int i = 0; i < nodeCount; i++) { uint keyCount = (ushort)(Util.ExtractTwelveBits(reader, dataOffset, 0) & 0x7FF); uint nextNodeDataOffset = (ushort)(Util.ExtractTwelveBits(reader, dataOffset, (ushort)(keyCount + 1))); Array.Resize(ref objects, (int)(objects.Length + keyCount)); for (int j = 0; j < keyCount; j++) { uint nodeOffset = Util.ExtractTwelveBits(reader, dataOffset, (uint)j + 1); var tmpOffset = (dataOffset + nodeOffset); objects[indexer] = new FileInfoBTree(reader, ref tmpOffset); indexer++; } dataOffset += nextNodeDataOffset; } return(objects); }
public static string ExtractStringAtOffset(EndianBinReader reader, uint offset) { reader.BaseStream.Seek(offset, SeekOrigin.Begin); byte Length = reader.ReadByte(); return(Encoding.ASCII.GetString(reader.ReadBytes(Length), 0, Length)); }
public static string ExtractStringAtOffset(ref EndianBinReader reader, uint offset) { reader.BaseStream.Position += offset; byte Length = reader.ReadByte(); return(Encoding.ASCII.GetString(reader.ReadBytes((int)Length)).TrimEnd('\0')); }
public static uint ExtractValueAndAdvance(EndianBinReader reader) { uint value = reader.ReadByte(); if ((value & 0x80) != 0) { uint mask = 0x80; do { value = ((value - mask) << 8) + reader.ReadByte(); mask = mask << 7; } while ((value & mask) != 0); } return(value); }
public FileIDBTree(EndianBinReader reader, ref uint offset) { reader.BaseStream.Seek(offset, SeekOrigin.Begin); Flag = reader.ReadByte(); offset++; NameIndex = Util.ExtractValueAndAdvance(reader, ref offset); ExtensionIndex = (Flag & kFILE_FLAG) != 0 ? Util.ExtractValueAndAdvance(reader, ref offset) : 0; EntryIndex = Util.ExtractValueAndAdvance(reader, ref offset); }
public RT05Header(EndianBinReader reader) { reader.BaseStream.Position = 0; if ((Magic = reader.ReadUInt32()) != Constants.RT05_MAGIC) { throw new Exception("Invalid magic, doesn't match RT05."); } EntryCount = reader.ReadUInt32(); Obfuscated = reader.ReadByte(); }
public _50TRHeader(EndianBinReader reader) { reader.BaseStream.Position = 0; if ((Magic = reader.ReadUInt32(EndianType.BIG_ENDIAN)) != Constants._50TR_MAGIC) { throw new Exception("Invalid magic, doesn't match 50TR."); } EntryCount = reader.ReadUInt32(); Obfuscated = reader.ReadByte(); }
public FileInfoBTree(EndianBinReader reader, ref uint offset) { reader.BaseStream.Seek(offset, SeekOrigin.Begin); CompressedFlag = reader.ReadByte(); offset++; EntryIndex = Util.ExtractValueAndAdvance(reader, ref offset); CompressedSize = Util.ExtractValueAndAdvance(reader, ref offset); UncompressedSize = (CompressedFlag & kFLAG) != 0 ? Util.ExtractValueAndAdvance(reader, ref offset) : CompressedSize; SegmentIndex = Util.ExtractValueAndAdvance(reader, ref offset); }
public static uint ExtractValueAndAdvance(EndianBinReader reader, ref uint ptr) { uint p = 0; reader.BaseStream.Seek((ptr + p++), SeekOrigin.Begin); uint value = reader.ReadByte(); if ((value & 0x80) != 0) { uint mask = 0x80; do { reader.BaseStream.Seek((ptr + p++), SeekOrigin.Begin); value = ((value - mask) << 8) + reader.ReadByte(); mask = mask << 7; } while ((value & mask) != 0); } ptr += p; return(value); }
public static int KeyEqualOP(Key key, EndianBinReader data) { EndianBinReader ptr = data; uint length = Util.ExtractValueAndAdvance(ptr); uint min_length = Math.Min(key.length, length); EndianBinReader p1 = (key.data); EndianBinReader p2 = (ptr); for (uint i = 0; i < min_length; ++i) { byte _p1 = p1.ReadByte(); byte _p2 = p2.ReadByte(); if (_p1 < _p2) { return(-1); } else if (_p1 > _p2) { return(1); } } if (key.length < length) { return(-1); } else if (key.length > length) { return(1); } else { return(0); } }
private void LoadFileIDBTree(EndianBinReader reader, ref FileIDBTree[] objects, uint offset) { uint childOffset = 0; uint nodeCount = 0; uint ptrNodeData = 0; reader.BaseStream.Seek(offset, System.IO.SeekOrigin.Begin); byte childCount = reader.ReadByte(); childOffset = reader.Read3BytesUInt32() + offset; nodeCount = reader.ReadUInt16(); ptrNodeData = (uint)reader.BaseStream.Position; if (objects == null) { objects = new FileIDBTree[0]; } uint indexer = (uint)objects.Length; for (int i = 0; i < nodeCount; i++) { uint keyCount = (ushort)(Util.ExtractTwelveBits(reader, ptrNodeData, 0) & 0x7FF); uint nextNodeDataOffset = (ushort)(Util.ExtractTwelveBits(reader, ptrNodeData, (ushort)(keyCount + 1))); Array.Resize(ref objects, (int)(objects.Length + keyCount)); for (int j = 0; j < keyCount; j++) { uint nodeOffset = Util.ExtractTwelveBits(reader, ptrNodeData, (uint)j + 1); var tmpOffset = (ptrNodeData + nodeOffset); objects[indexer] = new FileIDBTree(reader, ref tmpOffset); indexer++; } ptrNodeData += nextNodeDataOffset; } }
public StringBTree(EndianBinReader reader, uint offset) { reader.BaseStream.Seek(offset, SeekOrigin.Begin); Length = reader.ReadByte(); Text = Encoding.ASCII.GetString(reader.ReadBytes((int)Length)); }