08c5032ca8
I've setup a system for supporting multiple implementations for Roblox's file format. This will allow me to cover the binary format and xml format under the same general-purpose object. Haven't done much with the XML format yet, but I've been making some adjustments to the binary format implementation so that its more evenly branched out and doesn't retain more information than it needs to. I've also fixed some issues with the data-types, and documented the Instance object.
58 lines
1.5 KiB
C#
58 lines
1.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using LZ4;
|
|
|
|
namespace Roblox.BinaryFormat
|
|
{
|
|
public class RobloxBinaryChunk
|
|
{
|
|
public readonly string ChunkType;
|
|
|
|
public readonly int CompressedSize;
|
|
public readonly byte[] CompressedData;
|
|
|
|
public readonly int Size;
|
|
public readonly int Reserved;
|
|
public readonly byte[] Data;
|
|
|
|
public bool HasCompressedData => (CompressedSize > 0);
|
|
|
|
public override string ToString()
|
|
{
|
|
return ChunkType + " Chunk [" + Size + " bytes]";
|
|
}
|
|
|
|
public RobloxBinaryReader GetReader(string chunkType)
|
|
{
|
|
if (ChunkType == chunkType)
|
|
{
|
|
MemoryStream buffer = new MemoryStream(Data);
|
|
return new RobloxBinaryReader(buffer);
|
|
}
|
|
|
|
throw new Exception("Expected " + chunkType + " ChunkType from the input RobloxBinaryChunk");
|
|
}
|
|
|
|
public RobloxBinaryChunk(RobloxBinaryReader reader)
|
|
{
|
|
byte[] bChunkType = reader.ReadBytes(4);
|
|
ChunkType = Encoding.ASCII.GetString(bChunkType);
|
|
|
|
CompressedSize = reader.ReadInt32();
|
|
Size = reader.ReadInt32();
|
|
Reserved = reader.ReadInt32();
|
|
|
|
if (HasCompressedData)
|
|
{
|
|
CompressedData = reader.ReadBytes(CompressedSize);
|
|
Data = LZ4Codec.Decode(CompressedData, 0, CompressedSize, Size);
|
|
}
|
|
else
|
|
{
|
|
Data = reader.ReadBytes(Size);
|
|
}
|
|
}
|
|
}
|
|
}
|