当前位置:编程学习 > C#/ASP.NET >>

我有个PDF417的代码,但是我不懂是怎么实现的,谁能讲一下算法

--------------------编程问答--------------------

//文本模式
        protected internal virtual void textCompaction(int start, int length)
        {
            int[] dest = new int[ABSOLUTE_MAX_TEXT_SIZE * 2];
            int mode = ALPHA;
            int ptr = 0;
            int fullBytes = 0;
            int v = 0;
            int k;
            int size;
            length += start;
            for (k = start; k < length; ++k)
            {
                v = getTextTypeAndValue(length, k);
                if ((v & mode) != 0)
                {
                    dest[ptr++] = v & 0xff;
                    continue;
                }
                if ((v & ISBYTE) != 0)
                {
                    if ((ptr & 1) != 0)
                    {
                        dest[ptr++] = (mode & PUNCTUATION) != 0 ? PAL : PS;
                        mode = (mode & PUNCTUATION) != 0 ? ALPHA : mode;
                    }
                    dest[ptr++] = BYTESHIFT;
                    dest[ptr++] = v & 0xff;
                    fullBytes += 2;
                    continue;
                }
                switch (mode)
                {

                    case ALPHA://大写模式
                        if ((v & LOWER) != 0)
                        {
                            dest[ptr++] = LL;
                            dest[ptr++] = v & 0xff;
                            mode = LOWER;
                        }
                        else if ((v & MIXED) != 0)
                        {
                            dest[ptr++] = ML;
                            dest[ptr++] = v & 0xff;
                            mode = MIXED;
                        }
                        else if ((getTextTypeAndValue(length, k + 1) & getTextTypeAndValue(length, k + 2) & PUNCTUATION) != 0)
                        {
                            dest[ptr++] = ML;
                            dest[ptr++] = PL;
                            dest[ptr++] = v & 0xff;
                            mode = PUNCTUATION;
                        }
                        else
                        {
                            dest[ptr++] = PS;
                            dest[ptr++] = v & 0xff;
                        }
                        break;

                    case LOWER://小写模式
                        if ((v & ALPHA) != 0)
                        {
                            if ((getTextTypeAndValue(length, k + 1) & getTextTypeAndValue(length, k + 2) & ALPHA) != 0)
                            {
                                dest[ptr++] = ML;
                                dest[ptr++] = AL;
                                mode = ALPHA;
                            }
                            else
                            {
                                dest[ptr++] = AS;
                            }
                            dest[ptr++] = v & 0xff;
                        }
                        else if ((v & MIXED) != 0)
                        {
                            dest[ptr++] = ML;
                            dest[ptr++] = v & 0xff;
                            mode = MIXED;
                        }
                        else if ((getTextTypeAndValue(length, k + 1) & getTextTypeAndValue(length, k + 2) & PUNCTUATION) != 0)
                        {
                            dest[ptr++] = ML;
                            dest[ptr++] = PL;
                            dest[ptr++] = v & 0xff;
                            mode = PUNCTUATION;
                        }
                        else
                        {
                            dest[ptr++] = PS;
                            dest[ptr++] = v & 0xff;
                        }
                        break;

                    case MIXED://符号模式
                        if ((v & LOWER) != 0)
                        {
                            dest[ptr++] = LL;
                            dest[ptr++] = v & 0xff;
                            mode = LOWER;
                        }
                        else if ((v & ALPHA) != 0)
                        {
                            dest[ptr++] = AL;
                            dest[ptr++] = v & 0xff;
                            mode = ALPHA;
                        }
                        else if ((getTextTypeAndValue(length, k + 1) & getTextTypeAndValue(length, k + 2) & PUNCTUATION) != 0)
                        {
                            dest[ptr++] = PL;
                            dest[ptr++] = v & 0xff;
                            mode = PUNCTUATION;
                        }
                        else
                        {
                            dest[ptr++] = PS;
                            dest[ptr++] = v & 0xff;
                        }
                        break;

                    case PUNCTUATION://标点型子模式
                        dest[ptr++] = PAL;
                        mode = ALPHA;
                        --k;
                        break;
                }
            }
            if ((ptr & 1) != 0)
                dest[ptr++] = PS;
            size = (ptr + fullBytes) / 2;
            if (size + cwPtr > MAX_DATA_CODEWORDS)
            {
                throw new System.IndexOutOfRangeException("The text is too big.");
            }
            length = ptr;
            ptr = 0;
            while (ptr < length)
            {
                v = dest[ptr++];
                if (v >= 30)
                {
                    codewords[cwPtr++] = v;
                    codewords[cwPtr++] = dest[ptr++];
                }
                else
                    codewords[cwPtr++] = v * 30 + dest[ptr++];
            }
        }
//数字压缩子函数
        protected internal virtual void basicNumberCompaction(int start, int length)
        {
            int ret = cwPtr;
            int retLast = length / 3;
            int ni, k;
            cwPtr += retLast + 1;
            for (k = 0; k <= retLast; ++k)
                codewords[ret + k] = 0;
            codewords[ret + retLast] = 1;
            length += start;
            for (ni = start; ni < length; ++ni)
            {
                // multiply by 10
                for (k = retLast; k >= 0; --k)
                    codewords[ret + k] *= 10;
                // add the digit
                codewords[ret + retLast] += text[ni] - '0';
                // propagate carry
                for (k = retLast; k > 0; --k)
                {
                    codewords[ret + k - 1] += codewords[ret + k] / 900;
                    codewords[ret + k] %= 900;
                }
            }
        }
//数字压缩模式
        protected internal virtual void numberCompaction(int start, int length)
        {
            int full = (length / 44) * 15;
            int size = length % 44;
            int k;
            if (size == 0)
                size = full;
            else
                size = full + size / 3 + 1;
            if (size + cwPtr > MAX_DATA_CODEWORDS)
            {
                throw new System.IndexOutOfRangeException("The text is too big.");
            }
            length += start;
            for (k = start; k < length; k += 44)
            {
                size = length - k < 44 ? length - k : 44;
                basicNumberCompaction(k, size);
            }
        }
//字节压缩子函数,长度小于6位时执行此函数
        protected internal virtual void byteCompaction6(int start)
        {
            int length = 6;
            int ret = cwPtr;
            int retLast = 4;
            int ni, k;
            cwPtr += retLast + 1;
            for (k = 0; k <= retLast; ++k)
                codewords[ret + k] = 0;
            length += start;
            for (ni = start; ni < length; ++ni)
            {
                // multiply by 256
                for (k = retLast; k >= 0; --k)
                    codewords[ret + k] *= 256;
                // add the digit
                codewords[ret + retLast] += ((int)text[ni] & 0xff);
                // propagate carry
                for (k = retLast; k > 0; --k)
                {
                    codewords[ret + k - 1] += codewords[ret + k] / 900;
                    codewords[ret + k] %= 900;
                }
            }
        }
//字节压缩模式函数,长度大于6位时执行此函数
        internal virtual void byteCompaction(int start, int length)
        {
            int k, j;
            int size = (length / 6) * 5 + (length % 6);
            if (size + cwPtr > MAX_DATA_CODEWORDS)
            {
                throw new System.IndexOutOfRangeException("The text is too big.");
            }
            length += start;
            for (k = start; k < length; k += 6)
            {
                size = length - k < 44 ? length - k : 6;
                if (size < 6)
                {
                    for (j = 0; j < size; ++j)
                        codewords[cwPtr++] = (int)text[k + j] & 0xff;
                }
                else
                {
                    byteCompaction6(k);
                }
            }
        }

--------------------编程问答-------------------- 那么多都不懂吗?
几个关键的不懂地方,指出来。 --------------------编程问答-------------------- 我还是先看看吧,后天答辩了,今天还是没看懂代码 --------------------编程问答--------------------
引用 2 楼 computerfox 的回复:
那么多都不懂吗?
几个关键的不懂地方,指出来。


2L的文本模式不明白 --------------------编程问答--------------------
 protected internal virtual void basicNumberCompaction(int start, int length)
        {
            int ret = cwPtr;
            int retLast = length / 3;
            int ni, k;
            cwPtr += retLast + 1;
            for (k = 0; k <= retLast; ++k)
                codewords[ret + k] = 0;
            codewords[ret + retLast] = 1;
            length += start;
            for (ni = start; ni < length; ++ni)
            {
                // multiply by 10
                for (k = retLast; k >= 0; --k)
                    codewords[ret + k] *= 10;
                // add the digit
                codewords[ret + retLast] += text[ni] - '0';
                // propagate carry
                for (k = retLast; k > 0; --k)
                {
                    codewords[ret + k - 1] += codewords[ret + k] / 900;
                    codewords[ret + k] %= 900;
                }
            }
        }

这个是数字转换模式,把10进制数字转换成基900的数字(900进制),算法思想看得不太明白,求高人扔个简单明白点的算法 --------------------编程问答-------------------- SegmentList 你这个是哪个里面的?
能否发一个完整的给我。。小弟感谢了
116201048@qq.com --------------------编程问答-------------------- 能否发一个完整的给我。。万分感谢了
82459821@qq.com --------------------编程问答-------------------- 大概看了一下,就是建立了一个专门处理PDF417格式的二维条码的类。利用该类可以直接通过定义的函数来获取条码信息和对条码进行操作。
建议你看一下PDF417格式的二维条码的规范就明白了。 像这样的类是基于一些应用的,侧重点在于理解应用的规范而不是语言本身,语言和代码本身比较简单
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,