⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iec16022ecc200.cs

📁 DataMatrix二维条码识别算法,基于Windows
💻 CS
📖 第 1 页 / 共 4 页
字号:
                return (char)0;	// did not fit
            /*
             * for (tp = 0; tp < tl; tp++) fprintf (stderr, "%02X ", t[tp]); \
             * fprintf (stderr, "\n");
             */
            return (char)1;		// OK 
        }











        private byte[] encmake(int l, byte[] s, ref  int lenp, char exact)
        {

            int p = l;
            char e;

            TempStruct1[,] enc = new TempStruct1[MAXBARCODE, (int)EncType.E_MAX];


            //memset(&enc, 0, sizeof(enc));

            if (!(l != 0))
                return null;	// no length

            if (l > MAXBARCODE)
                return null;	// not valid

            while ((p--) > 0)
            {
                char b = (char)0;
                char sub;
                int sl, tl, bl, t;
                // consider each encoding from this point
                // ASCII
                sl = tl = 1;
                if (isdigit(s[p]) && p + 1 < l && isdigit(s[p + 1]))
                    sl = 2;	// double digit
                else if ((s[p] & 0x80) != 0)
                    tl = 2;	// high shifted
                bl = 0;
                if (p + sl < l)
                    for (e = (char)0; e < (int)EncType.E_MAX; e++)
                        if ((enc[p + sl, e].t != 0) && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0)))
                        {
                            bl = t;
                            b = e;
                        }
                enc[p, (int)EncType.E_ASCII].t = (short)(tl + bl);
                enc[p, (int)EncType.E_ASCII].s = (short)sl;
                if ((bl != 0) && b == (int)EncType.E_ASCII)
                    enc[p, b].s += enc[p + sl, b].s;
                // C40
                sub = (char)0;
                tl = 0;
                sl = 0;

                do
                {
                    byte c = s[p + sl++];
                    if ((c & 0x80) != 0)
                    {	// shift + upper
                        sub += (char)2;
                        c &= 0x7F;
                    }
                    if (c != ' ' && !isdigit(c) && !isupper(c))
                        sub++;	// shift
                    sub++;
                    while (sub >= 3)
                    {
                        sub -= (char)3;
                        tl += 2;
                    }
                } while ((sub != 0) && (p + sl < l));
                if ((exact != 0) && sub == 2 && p + sl == l)
                {
                    // special case, can encode last block with shift 0 at end (Is this 
                    // valid when not end of target buffer?)
                    sub = (char)0;
                    tl += 2;
                }
                if (!(sub != 0))
                {	// can encode C40
                    bl = 0;
                    if (p + sl < l)
                        for (e = (char)0; e < (int)EncType.E_MAX; e++)
                            if ((enc[p + sl, e].t != 0) && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_C40, e]) < bl || !(bl != 0)))
                            {
                                bl = t;
                                b = e;
                            }
                    if ((exact != 0) && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
                    {
                        // special case, switch to ASCII for last bytes
                        bl = 1;
                        b = (char)EncType.E_ASCII;
                    }
                    enc[p, (int)EncType.E_C40].t = (short)(tl + bl);
                    enc[p, (int)EncType.E_C40].s = (short)sl;
                    if (bl != 0 && b == (int)EncType.E_C40)
                        enc[p, b].s += enc[p + sl, b].s;
                }
                // Text
                sub = (char)0;
                tl = 0;
                sl = 0;
                do
                {
                    byte c = s[p + sl++];
                    if ((c & 0x80) != 0)
                    {	// shift + upper
                        sub += (char)2;
                        c &= 0x7F;
                    }
                    if (c != ' ' && !isdigit(c) && !islower(c))
                        sub++;	// shift
                    sub++;
                    while (sub >= 3)
                    {
                        sub -= (char)3;
                        tl += 2;
                    }
                } while (sub != 0 && (p + sl < l));
                if (exact != 0 && sub == 2 && p + sl == l)
                {
                    // special case, can encode last block with shift 0 at end (Is this 
                    // valid when not end of target buffer?)
                    sub = (char)0;
                    tl += 2;
                }
                if (!(sub != 0) && (sl != 0))
                {	// can encode Text
                    bl = 0;
                    if (p + sl < l)
                        for (e = (char)0; e < (int)EncType.E_MAX; e++)
                            if (enc[p + sl, e].t != 0
                                &&
                                ((t =
                                  enc[p + sl, e].t +
                                  switchcost[(int)EncType.E_TEXT, e]) < bl
                                 || !(bl != 0)))
                            {
                                bl = t;
                                b = e;
                            }
                    if (exact != 0 && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
                    {	// special case, switch to ASCII for last bytes
                        bl = 1;
                        b = (char)EncType.E_ASCII;
                    }
                    enc[p, (int)EncType.E_TEXT].t = (short)(tl + bl);
                    enc[p, (int)EncType.E_TEXT].s = (short)sl;
                    if (bl != 0 && b == (int)EncType.E_TEXT)
                        enc[p, b].s += enc[p + sl, b].s;
                }
                // X12
                sub = (char)0;
                tl = 0;
                sl = 0;
                do
                {
                    byte c = s[p + sl++];
                    if (c != 13 && c != '*' && c != '>' && c != ' '
                        && !isdigit(c) && !isupper(c))
                    {
                        sl = 0;
                        break;
                    }
                    sub++;
                    while (sub >= 3)
                    {
                        sub -= (char)3;
                        tl += 2;
                    }
                } while (sub != 0 && p + sl < l);
                if (!(sub != 0) && (sl != 0))
                {	// can encode X12
                    bl = 0;
                    if (p + sl < l)
                        for (e = (char)0; e < (int)EncType.E_MAX; e++)
                            if (enc[p + sl, e].t != 0 && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_X12, e]) < bl || !(bl != 0)))
                            {
                                bl = t;
                                b = e;
                            }
                    if (exact != 0 && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
                    {
                        // special case, switch to ASCII for last bytes
                        bl = 1;
                        b = (char)EncType.E_ASCII;
                    }
                    enc[p, (int)EncType.E_X12].t = (short)(tl + bl);
                    enc[p, (int)EncType.E_X12].s = (short)sl;
                    if (bl != 0 && b == (int)EncType.E_X12)
                        enc[p, b].s += enc[p + sl, b].s;
                }
                // EDIFACT
                sl = bl = 0;
                if (s[p + 0] >= 32 && s[p + 0] <= 94)
                {	// can encode 1
                    char bs = (char)0;
                    if (p + 1 == l && (!(bl != 0) || bl < 2))
                    {
                        bl = 2;
                        bs = (char)1;
                    }
                    else
                        for (e = (char)0; e < (int)EncType.E_MAX; e++)
                            if (e != (int)EncType.E_EDIFACT && enc[p + 1, e].t != 0 && ((t = 2 + enc[p + 1, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0)))	// E_ASCII as allowed for unlatch
                            {
                                bs = (char)1;
                                bl = t;
                                b = e;
                            }
                    if (p + 1 < l && s[p + 1] >= 32 && s[p + 1] <= 94)
                    {	// can encode 2
                        if (p + 2 == l && (!(bl != 0) || bl < 2))
                        {
                            bl = 3;
                            bs = (char)2;
                        }
                        else
                            for (e = (char)0; e < (int)EncType.E_MAX; e++)
                                if (e != (int)EncType.E_EDIFACT
                                    && enc[p + 2, e].t != 0
                                    &&
                                    ((t =
                                      3 + enc[p + 2, e].t +
                                      switchcost[(int)EncType.E_ASCII, e])
                                     < bl || !(bl != 0)))	// E_ASCII as allowed for unlatch
                                {
                                    bs = (char)2;
                                    bl = t;
                                    b = e;
                                }
                        if (p + 2 < l && s[p + 2] >= 32 && s[p + 2] <= 94)
                        {	// can encode 3
                            if (p + 3 == l && (!(bl != 0) || bl < 3))
                            {
                                bl = 3;
                                bs = (char)3;
                            }
                            else
                                for (e = (char)0; e < (int)EncType.E_MAX; e++)
                                    if (e != (int)EncType.E_EDIFACT
                                        && enc[p + 3, e].t != 0
                                        && ((t = 3 + enc[p + 3, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0)))	// E_ASCII as allowed for unlatch
                                    {
                                        bs = (char)3;
                                        bl = t;
                                        b = e;
                                    }
                            if (p + 4 < l && s[p + 3] >= 32 && s[p + 3] <= 94)
                            {	// can encode 4
                                if (p + 4 == l && (!(bl != 0) || bl < 3))
                                {
                                    bl = 3;
                                    bs = (char)4;
                                }
                                else
                                {
                                    for (e = (char)0; e < (int)EncType.E_MAX;
                                         e++)
                                        if (enc[p + 4, e].t != 0 && ((t = 3 + enc[p + 4, e].t + switchcost[(int)EncType.E_EDIFACT, e]) < bl || !(bl != 0)))
                                        {
                                            bs = (char)4;
                                            bl = t;
                                            b = e;
                                        }
                                    if (exact != 0
                                        && enc[p + 4, (int)EncType.E_ASCII].t != 0
                                        && enc[p + 4, (int)EncType.E_ASCII].
                                        t <= 2
                                        && (t = 3 + enc[p + 4, (int)EncType.E_ASCII].t) < bl)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -