private BlzResult BLZ_Encode(byte[] data, int mode) { this.newLen = 0; byte[] rawBuffer = BlzCoder.PrepareData(data); int rawLen = rawBuffer.Length - 3; byte[] pakBuffer = null; int pakLen = BlzMaxim + 1; byte[] newBuffer = this.BLZ_Code(rawBuffer, rawLen, mode); if (this.newLen < pakLen) { pakBuffer = newBuffer; pakLen = this.newLen; } return(new BlzResult(pakBuffer, pakLen)); }
private static BlzResult BLZ_Decode(byte[] data) { int rawLen, len; int encLen, decLen; int flags = 0; byte[] pakBuffer = BlzCoder.PrepareData(data); int pakLen = pakBuffer.Length - 3; int incLen = BitConverter.ToInt32(pakBuffer, pakLen - 4); if (incLen < 1) { Console.Write(", WARNING: not coded file!"); encLen = 0; decLen = pakLen; pakLen = 0; rawLen = decLen; } else { if (pakLen < 8) { Console.Write(Environment.NewLine + "File has a bad header" + Environment.NewLine); return(null); } int hdrLen = pakBuffer[pakLen - 5]; if (hdrLen < 8 || hdrLen > 0xB) { Console.Write(Environment.NewLine + "Bad header length" + Environment.NewLine); return(null); } if (pakLen <= hdrLen) { Console.Write(Environment.NewLine + "Bad length" + Environment.NewLine); return(null); } encLen = (int)(BitConverter.ToUInt32(pakBuffer, pakLen - 8) & 0x00FFFFFF); decLen = pakLen - encLen; pakLen = encLen - hdrLen; rawLen = decLen + encLen + incLen; if (rawLen > RawMaxim) { Console.Write(Environment.NewLine + "Bad decoded length" + Environment.NewLine); return(null); } } byte[] rawBuffer = new byte[rawLen]; int pak = 0; int raw = 0; int pakEnd = decLen + pakLen; int rawEnd = rawLen; for (len = 0; len < decLen; len++) { rawBuffer[raw++] = pakBuffer[pak++]; } BlzCoder.BLZ_Invert(pakBuffer, decLen, pakLen); int mask = 0; while (raw < rawEnd) { if ((mask = (int)((uint)mask >> BlzShift)) == 0) { if (pak == pakEnd) { break; } flags = pakBuffer[pak++]; mask = BlzMask; } if ((flags & mask) == 0) { if (pak == pakEnd) { break; } rawBuffer[raw++] = pakBuffer[pak++]; } else { if (pak + 1 >= pakEnd) { break; } int pos = pakBuffer[pak++] << 8; pos |= pakBuffer[pak++]; len = (int)((uint)pos >> 12) + BlzThreshold + 1; if (raw + len > rawEnd) { Console.Write(", WARNING: wrong decoded length!"); len = rawEnd - raw; } pos = (pos & 0xFFF) + 3; while (len-- > 0) { int charHere = rawBuffer[raw - pos]; rawBuffer[raw++] = (byte)charHere; } } } BlzCoder.BLZ_Invert(rawBuffer, decLen, rawLen - decLen); rawLen = raw; if (raw != rawEnd) { Console.Write(", WARNING: unexpected end of encoded file!"); } return(new BlzResult(rawBuffer, rawLen)); }