public override object Unmarshal(LittleEndianByteBuffer buffer, ref int offset) { var result = new LZNT1_FlagData(); result.Flag_byte = (byte)buffer.ReadBytes(offset, 1); offset++; var data = new List <LZNT1_Data>(); for (int i = 0; i < 8; i++) { if (offset < buffer.Count) { bool compressed = (result.Flag_byte & (1 << i)) != 0; if (compressed) { data.Add(Unmarshal <LZNT1_CompressedWord>(buffer, ref offset)); } else { data.Add(Unmarshal <LZNT1_Literal>(buffer, ref offset)); } } } result.Data = data.ToArray(); return(result); }
public static LZNT1_Chunk Compress(byte[] arg, List <LZNT1_Data> data) { int compressedLength = CalculateCompressedLength(data); if (compressedLength < arg.Length) { var compressedChunk = new LZNT1_CompressedChunk(); compressedChunk.Chunk_header = new LZNT1_ChunkHeader(); compressedChunk.Chunk_header.Value = 0xB000; compressedChunk.Chunk_header.Value |= compressedLength - 3; compressedChunk.Flag_group = new LZNT1_FlagGroup(); var flagData = new List <LZNT1_FlagData>(); int i = 0; while (i < data.Count) { int groupLength = Math.Min(8, data.Count - i); var group = data.Skip(i).Take(groupLength); var flagDataItem = new LZNT1_FlagData(group.ToArray()); flagData.Add(flagDataItem); i += groupLength; } compressedChunk.Flag_group.Flag_data = flagData.ToArray(); return(compressedChunk); } else { var uncompressedChunk = new LZNT1_UncompressedChunk(); uncompressedChunk.Chunk_header = new LZNT1_ChunkHeader(); uncompressedChunk.Chunk_header.Value = 0x3000; uncompressedChunk.Chunk_header.Value |= arg.Length - 1; uncompressedChunk.Uncompressed_data = arg.ToArray(); return(uncompressedChunk); } }