예제 #1
0
        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));
        }
예제 #2
0
        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));
        }