Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }