• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            通用產(chǎn)品代碼 UPC

            來自于《編碼》

            幾乎每件商品上都有所謂的條形碼,即通用產(chǎn)品代碼 UPC(Universal Product Code)。其可以標(biāo)識該商品是哪個廠家生產(chǎn)的,并且是這個廠家的哪個商品。這里面并無價格信息,可以根據(jù)其所標(biāo)識的代碼去查詢賣家的計算機系統(tǒng)得到其價格。
            UPC 是有寬度各不相同的黑白條碼組成,根據(jù)其寬度映射為一個二進制序列,總共有 95 位
            從左到右依次是:
            101 三位的最左邊護線
            7 * 6 四十二位的左邊數(shù)字,7 位標(biāo)識一個數(shù)字,總共有 6 個數(shù)字
            01010 五位中間護線
            7 * 6 四十二位的左邊數(shù)字,7 為標(biāo)識一個數(shù)字,總共有 6 個數(shù)字
            101 三位的最右邊護線

            3 + 42 + 5 + 42 + 3,即 95 位 01 序列。

            UPC 也可以反向掃描,這樣增加了賣家售貨員的操作便宜性,同時也對生產(chǎn)廠商靈活性也給大,只不過這種靈活性不應(yīng)該利用。
            可以反向掃描的原因在于,左右標(biāo)識的 6 個數(shù)字編碼不相同。
            正向的情況:
            左邊數(shù)字編碼如下:
            0001101 = 0
            0011001 = 1
            0010011 = 2
            0111101 = 3
            0100011 = 4
            0110001 = 5
            0101111 = 6
            0111011 = 7
            0110111 = 8
            0001011 = 9
            左邊數(shù)字編碼如下:
            1110010 = 0
            1100110 = 1
            1101100 = 2
            1000010 = 3
            1011100 = 4
            1001110 = 5
            1010000 = 6
            1000100 = 7
            1001000 = 8
            1110100 = 9
            從中我們可以看到左邊數(shù)字的編碼,都是 0 開頭,1 結(jié)尾的。同時每個數(shù)字的 7 位編碼中都是有奇數(shù)個 1 ,這是奇校驗。
            左邊數(shù)字的編碼,都是 1 開頭,0 結(jié)尾的。同時每個數(shù)字的 7 為編碼都是有偶數(shù)個 1 ,這是偶校驗。
            針對一個 UPC 進行掃描的時候,首先檢查第一個數(shù)字編碼是否符合奇校驗,如果符合則其實正向讀取的。如果符合偶校驗,則是反向讀取的。

            左右個標(biāo)識 6 個數(shù)字,總共 12 個數(shù)字 A BCDEF GHIJK L,其中
            第一個數(shù)字標(biāo)識該商品屬于那種類別。
            2 - 6 標(biāo)識哪個制造商
            7 - 11 標(biāo)識制造商的哪個商品
            最后一個數(shù)字是模校驗字符。計算方式如下:L = 10 - (3 * (A + C + E + G + I + K) + (B + D F + H + J)) % 10;

            這里要做的工作就是:
            對通用產(chǎn)品代碼 UPC
            ·編碼
            ·解碼
            ·模校驗
            ·輸出
            ·倒著讀取的情況
            ·壓縮

              1 #include <iostream>
              2 #include <string>
              3 #include <map>
              4 #include <algorithm>
              5 using namespace std;
              6 
              7 void init(map<charstring>& encoding_left, map<charstring>& encoding_right, map<stringchar>& decoding)
              8 {
              9     encoding_left['0'= "0001101";
             10     encoding_left['1'= "0011001";
             11     encoding_left['2'= "0010011";
             12     encoding_left['3'= "0111101";
             13     encoding_left['4'= "0100011";
             14     encoding_left['5'= "0110001";
             15     encoding_left['6'= "0101111";
             16     encoding_left['7'= "0111011";
             17     encoding_left['8'= "0110111";
             18     encoding_left['9'= "0001011";
             19 
             20     encoding_right['0'= "1110010";
             21     encoding_right['1'= "1100110";
             22     encoding_right['2'= "1101100";
             23     encoding_right['3'= "1000010";
             24     encoding_right['4'= "1011100";
             25     encoding_right['5'= "1001110";
             26     encoding_right['6'= "1010000";
             27     encoding_right['7'= "1000100";
             28     encoding_right['8'= "1001000";
             29     encoding_right['9'= "1110100";
             30 
             31     decoding["0001101"= '0';
             32     decoding["0011001"= '1';
             33     decoding["0010011"= '2';
             34     decoding["0111101"= '3';
             35     decoding["0100011"= '4';
             36     decoding["0110001"= '5';
             37     decoding["0101111"= '6';
             38     decoding["0111011"= '7';
             39     decoding["0110111"= '8';
             40     decoding["0001011"= '9';
             41 
             42     decoding["1110010"= '0';
             43     decoding["1100110"= '1';
             44     decoding["1101100"= '2';
             45     decoding["1000010"= '3';
             46     decoding["1011100"= '4';
             47     decoding["1001110"= '5';
             48     decoding["1010000"= '6';
             49     decoding["1000100"= '7';
             50     decoding["1001000"= '8';
             51     decoding["1110100"= '9';
             52 
             53     decoding["0100111"= '0';
             54     decoding["0110011"= '1';
             55     decoding["0011011"= '2';
             56     decoding["0100001"= '3';
             57     decoding["0011101"= '4';
             58     decoding["0111001"= '5';
             59     decoding["0000101"= '6';
             60     decoding["0010001"= '7';
             61     decoding["0001001"= '8';
             62     decoding["0010111"= '9';
             63 
             64     decoding["1011000"= '0';
             65     decoding["1001100"= '1';
             66     decoding["1100100"= '2';
             67     decoding["1011110"= '3';
             68     decoding["1100010"= '4';
             69     decoding["1000110"= '5';
             70     decoding["1111010"= '6';
             71     decoding["1101110"= '7';
             72     decoding["1110110"= '8';
             73     decoding["1101000"= '9';
             74 
             75     //cout << encoding_left.size() << endl;
             76     //cout << encoding_right.size() << endl;
             77     //cout << decoding.size() << endl;
             78 }
             79 
             80 string dropSpaces(string& code)
             81 {
             82     string ret;
             83     for (string::size_type i = 0; i != code.size(); ++i)
             84     {
             85         if (code[i] >= '0' && code[i] <= '9')
             86         {
             87             ret += code[i];
             88         }
             89     }
             90     code = ret;
             91     return ret;
             92 }
             93 
             94 string encode(const string& code_e, const map<charstring>& encoding_left, const map<charstring>& encoding_right)
             95 {
             96     string code = code_e;
             97     dropSpaces(code);
             98     if (code.size() != 11)
             99     {
            100         return "Error!";
            101     }
            102     string ret;
            103 
            104     ret += "101";
            105     for (string::size_type i = 0; i != 6++i)
            106     {
            107         map<charstring>::const_iterator cit = encoding_left.find(code[i]);
            108         if (cit != encoding_left.end())
            109         {
            110             ret += cit->second;
            111         }
            112         else
            113         {
            114             return "Error!";
            115         }
            116     }
            117     ret += "01010";
            118     for (string::size_type i = 6; i != code.size(); ++i)
            119     {
            120         map<charstring>::const_iterator cit = encoding_right.find(code[i]);
            121         if (cit != encoding_right.end())
            122         {
            123             ret += cit->second;
            124         }
            125         else
            126         {
            127             return "Error!";
            128         }
            129     }
            130 
            131     int x = 0;
            132     for (string::size_type i = 0; i < code.size(); i += 2)
            133     {
            134         x += (code[i] - '0');
            135     }
            136     x *= 3;
            137     for (string::size_type i = 1; i < code.size(); i += 2)
            138     {
            139         x += (code[i] - '0');
            140     }
            141     x = 10 - x % 10;
            142     map<charstring>::const_iterator cit = encoding_right.find(x + '0');
            143     if (cit != encoding_right.end())
            144     {
            145         ret += cit->second;
            146     }
            147     else
            148     {
            149         return "Error!";
            150     }
            151 
            152     ret += "101";
            153     return ret;
            154 }
            155 
            156 string decode(const string& eode, map<stringchar>& decoding)
            157 {
            158     if (eode.size() != 95)
            159     {
            160         return "Error!";
            161     }
            162     string ret;
            163     string t = eode.substr(37);
            164     bool f = true;
            165     for (string::size_type i = 0; i != t.size(); ++i)
            166     {
            167         if (t[i] == '1')
            168         {
            169             f = !f;
            170         }
            171     }
            172     for (int i = 0; i != 6++i)
            173     {
            174         string tmp = eode.substr(3 + 7 * i, 7);
            175         map<stringchar>::const_iterator cit = decoding.find(tmp);
            176         if (cit != decoding.end())
            177         {
            178             ret += cit->second;
            179         }
            180         else
            181         {
            182             return "Error!";
            183         }
            184     }
            185     for (int i = 0; i != 6++i)
            186     {
            187         string tmp = eode.substr(50 + 7 * i, 7);
            188         map<stringchar>::const_iterator cit = decoding.find(tmp);
            189         if (cit != decoding.end())
            190         {
            191             ret += cit->second;
            192         }
            193         else
            194         {
            195             return "Error!";
            196         }
            197     }
            198     if (f)
            199     {
            200         reverse(ret.begin(), ret.end());
            201     }
            202     ret = ret.substr(01+ " " + ret.substr(15+ " " + ret.substr(65+ " " + ret.substr(111);
            203     return ret;
            204 }
            205 
            206 string compress(const string& eode)
            207 {
            208     string ret;
            209     return ret;
            210 }
            211 
            212 void display(const string& eode)
            213 {
            214     string tmp;
            215     for (string::size_type i = 0; i != 70++i)
            216     {
            217         if (eode[i] == '0')
            218         {
            219             tmp += ' ';
            220         }
            221         else
            222         {
            223             tmp += '@';
            224         }
            225     }
            226     tmp += '\n';
            227     for (int i = 0; i != 10++i)
            228     {
            229         cout << tmp << endl;
            230     }
            231 }
            232 
            233 int main()
            234 {
            235     map<charstring> encoding_left, encoding_right;
            236     map<stringchar> decoding;
            237     init(encoding_left, encoding_right, decoding);
            238     string code;
            239     while (getline(cin, code))
            240     {
            241         string eode = encode(code, encoding_left, encoding_right);
            242 
            243         cout << code << endl;
            244         cout << eode << endl;
            245         cout << eode.size() << endl;
            246 
            247         display(eode);
            248         reverse(eode.begin(), eode.end());
            249 
            250         code = decode(eode, decoding);
            251         cout << code << endl;
            252         cout << code.size() << endl;
            253     }
            254 }
            255 

             


            posted on 2011-11-18 11:14 unixfy 閱讀(753) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品中文字幕一区 | 欧美久久一区二区三区| 久久人人超碰精品CAOPOREN| 久久夜色精品国产www| 久久夜色精品国产噜噜噜亚洲AV | 久久久久综合中文字幕| 亚洲国产精品无码久久| 国产成人无码精品久久久免费 | 久久婷婷久久一区二区三区| 久久久青草青青国产亚洲免观| 久久久久久亚洲AV无码专区| 久久免费观看视频| 国产99精品久久| 麻豆精品久久久久久久99蜜桃| 88久久精品无码一区二区毛片| 无码人妻久久一区二区三区免费丨 | 亚洲精品国产综合久久一线| 66精品综合久久久久久久| 久久久国产打桩机| 亚洲国产香蕉人人爽成AV片久久| 麻豆精品久久久一区二区| 久久男人Av资源网站无码软件 | 国产精品视频久久久| 人妻无码αv中文字幕久久| 久久受www免费人成_看片中文 | 久久久久亚洲Av无码专| 精品久久久无码21p发布| 久久精品极品盛宴观看| 四虎亚洲国产成人久久精品| 久久国产精品波多野结衣AV| 久久精品人人做人人爽电影| 久久精品国产亚洲av影院| 国产A三级久久精品| 久久久久亚洲精品日久生情 | 性做久久久久久久久老女人| 中文字幕成人精品久久不卡| 狠狠色丁香久久综合婷婷| 2021久久国自产拍精品| 国产亚洲欧美成人久久片| 国内精品久久国产大陆| 大美女久久久久久j久久|