public static List <LZNT1_Data> GenerateFromLZ77Match(byte[] arg, LZ77Match match, ref int processedBytes) { var result = new List <LZNT1_Data>(); int remainingLength = match.Length; while (remainingLength >= 3) { var compressedWord = new LZNT1_CompressedWord(); int displacementBits = GetDisplcaementBits(processedBytes); int maximumLength = GetMaximumLength(processedBytes); int length = Math.Min(remainingLength, maximumLength); compressedWord.Value = 0; compressedWord.Value |= (length - 3) & ((1 << (16 - displacementBits)) - 1); compressedWord.Value |= ((match.Distance - 1) & ((1 << displacementBits) - 1)) << (16 - displacementBits); result.Add(compressedWord); processedBytes += length; remainingLength -= length; } for (int i = 0; i < remainingLength; i++) { var literal = new LZNT1_Literal(); literal.Literal = arg[processedBytes - match.Distance]; result.Add(literal); processedBytes++; } return(result); }
public override object Unmarshal(LittleEndianByteBuffer buffer, ref int offset) { var result = new LZNT1_CompressedWord(); result.Value = buffer.ReadBytes(offset, 2); offset += 2; return(result); }
public static List <LZNT1_Data> GenerateFromLZ77Symbol(byte[] arg, LZ77Symbol symbol, ref int processedBytes) { var result = new List <LZNT1_Data>(); if (symbol is LZ77Literal) { var literal = symbol as LZ77Literal; result.Add(LZNT1_Literal.GenerateFromLZ77Literal(literal, ref processedBytes)); } else if (symbol is LZ77Match) { var match = symbol as LZ77Match; result.AddRange(LZNT1_CompressedWord.GenerateFromLZ77Match(arg, match, ref processedBytes)); } else if (symbol is LZ77EOF) { // do nothing to EOF. } else { throw new XcaException("Unreachable code!"); } return(result); }