Пример #1
0
 public override void Decode(LittleEndianByteBuffer buffer, ref int offset)
 {
     for (int i = 0; i < Length; i++)
     {
         int matchByte = buffer.ReadBytes(offset - Distance + i, 1);
         buffer.WriteBytes(offset + i, matchByte, 1);
     }
     offset += Length;
 }
Пример #2
0
 public override void Marshal(LittleEndianByteBuffer buffer, ref int offset)
 {
     Chunk_header.Marshal(buffer, ref offset);
     foreach (byte b in Uncompressed_data)
     {
         buffer.WriteBytes(offset, b, 1);
         offset++;
     }
 }
Пример #3
0
 public override void Marshal(LittleEndianByteBuffer buffer, ref int offset)
 {
     buffer.WriteBytes(offset, Flag_byte, 1);
     offset++;
     foreach (var data in Data)
     {
         data.Marshal(buffer, ref offset);
     }
 }
Пример #4
0
 public override void Decode(LittleEndianByteBuffer buffer, ref int offset)
 {
     buffer.WriteBytes(offset, Literal, 1);
     offset++;
 }
        /// <summary>
        /// Encode LZ77 symbols.
        /// </summary>
        /// <param name="symbols">LZ77 symbols to be encoded.</param>
        /// <returns>Byte array containing encoded result.</returns>
        public byte[] Encode(List <LZ77Symbol> symbols)
        {
            long Flags              = 0;
            int  FlagCount          = 0;
            int  FlagOutputPosition = 0;
            int  OutputPosition     = 4;
            int  LastLengthHalfByte = 0;

            var buffer = new LittleEndianByteBuffer();

            foreach (var symbol in symbols)
            {
                if (symbol is LZ77Literal)
                {
                    var literal = symbol as LZ77Literal;

                    buffer.WriteBytes(OutputPosition, literal.Literal, 1);

                    OutputPosition += 1;

                    Flags <<= 1;

                    FlagCount += 1;
                }
                else if (symbol is LZ77Match)
                {
                    var match       = symbol as LZ77Match;
                    int MatchLength = match.Length;
                    int MatchOffset = match.Distance;

                    MatchLength -= 3;

                    MatchOffset -= 1;

                    MatchOffset <<= 3;

                    if (MatchLength < 7)
                    {
                        MatchOffset += (int)MatchLength;

                        buffer.WriteBytes(OutputPosition, MatchOffset, 2);

                        OutputPosition += 2;
                    }
                    else
                    {
                        MatchOffset |= 7;

                        buffer.WriteBytes(OutputPosition, MatchOffset, 2);

                        OutputPosition += 2;

                        MatchLength -= 7;

                        bool EncodeExtraLen;

                        if (LastLengthHalfByte == 0)
                        {
                            LastLengthHalfByte = OutputPosition;

                            if (MatchLength < 15)
                            {
                                buffer.WriteBytes(OutputPosition, MatchLength, 1);

                                OutputPosition += 1;

                                EncodeExtraLen = false;
                            }
                            else
                            {
                                buffer.WriteBytes(OutputPosition, 15, 1);

                                OutputPosition++;

                                EncodeExtraLen = true;
                            }
                        }
                        else
                        {
                            if (MatchLength < 15)
                            {
                                byte LastLength = buffer[LastLengthHalfByte];

                                LastLength |= (byte)(MatchLength << 4);

                                buffer.WriteBytes(LastLengthHalfByte, LastLength, 1);

                                LastLengthHalfByte = 0;

                                EncodeExtraLen = false;
                            }
                            else
                            {
                                byte LastLength = buffer[LastLengthHalfByte];

                                LastLength |= 15 << 4;

                                buffer.WriteBytes(LastLengthHalfByte, LastLength, 1);

                                LastLengthHalfByte = 0;

                                EncodeExtraLen = true;
                            }
                        }

                        if (EncodeExtraLen)
                        {
                            MatchLength -= 15;

                            if (MatchLength < 255)
                            {
                                buffer.WriteBytes(OutputPosition, MatchLength, 1);

                                OutputPosition += 1;
                            }
                            else
                            {
                                buffer.WriteBytes(OutputPosition, 255, 1);

                                OutputPosition += 1;

                                MatchLength += 7 + 15;

                                if (MatchLength < (1 << 16))
                                {
                                    buffer.WriteBytes(OutputPosition, MatchLength, 2);

                                    OutputPosition += 2;
                                }
                                else
                                {
                                    buffer.WriteBytes(OutputPosition, 0, 2);

                                    OutputPosition += 2;

                                    buffer.WriteBytes(OutputPosition, MatchLength, 4);

                                    OutputPosition += 4;
                                }
                            }
                        }
                    }

                    Flags = (Flags << 1) | 1;

                    FlagCount += 1;
                }
                else if (symbol is LZ77EOF)
                {
                    // Do nothing to EOF.
                }
                else
                {
                    throw new XcaException("Unreachable code!");
                }

                if (FlagCount == 32)
                {
                    buffer.WriteBytes(FlagOutputPosition, (int)Flags, 4);

                    FlagCount = 0;

                    FlagOutputPosition = OutputPosition;

                    OutputPosition += 4;
                }
            }

            Flags <<= (32 - FlagCount);
            Flags  |= (((long)1 << (32 - FlagCount)) - 1);

            buffer.WriteBytes(FlagOutputPosition, (int)Flags, 4);

            return(buffer.GetBytes());
        }
Пример #6
0
 public override void Marshal(LittleEndianByteBuffer buffer, ref int offset)
 {
     buffer.WriteBytes(offset, Value, 2);
     offset += 2;
 }