public void Visit(LzCompressed lz, byte data) { var start = index; (int runLength, int runOffset) = LZRun.ReadCompressedToken(buffer, ref start); Result = $"{runLength}:{runOffset}"; }
public void Visit(LzCompressed lz, byte data) { if (!CurrentText.EndsWith(" ")) { return; } var sections = CurrentText.Trim().Split(":"); if (sections.Length != 2) { return; } if (!int.TryParse(sections[0], out int runLength)) { return; } if (!int.TryParse(sections[1], out int runOffset)) { return; } Result = true; if (runLength < 3 || runLength > 18) { ErrorText = "Run Length must be > 2 and < 19"; return; } else if (runOffset < 1 || runOffset > 0x1000) { ErrorText = "Run Offset must be > 0 and <= 4096"; return; } var result = LZRun.CompressedToken((byte)runLength, (short)runOffset); var previousValue = Model.ReadMultiByteValue(memoryLocation, 2); CurrentChange.ChangeData(Model, memoryLocation, result[0]); CurrentChange.ChangeData(Model, memoryLocation + 1, result[1]); var run = (LZRun)Model.GetNextRun(memoryLocation); int runIndex = memoryLocation - run.Start; if (!TryFixupLzRun(ref run, runIndex + 2)) { Model.WriteMultiByteValue(memoryLocation, 2, CurrentChange, previousValue); ErrorText = $"Could not write {runLength}:{runOffset} without making the compressed data invalid."; } else { NewDataIndex = run.Start + runIndex + 2; } }
public void ValidHeaderIsRecognized() { var data = new byte[] { 0x10, 8, 0, 0, 0b000000, 0, 0, 0, 0, 0, 0, 0, 0 }; Assert.NotEqual(-1, LZRun.IsCompressedLzData(data, 0)); }