第二步,把大象裝進去——代碼分析
我們的目標是把一個字符串轉(zhuǎn)化為一個條形碼顯示在頁面上。那么一個字符串如何對應出一個條形碼呢?上面做個128X8的圖片到底是要扯什么蛋?
我們可以考慮數(shù)據(jù)在存儲器中的最基本儲存單位——字節(jié)(byte) 一個字節(jié)是八位(bit)。一個8位二進制數(shù)可以通過一個2位的十六進制數(shù)表示,表示為 00 - FF。剛才提到了一個16,注意到了嗎?
如何把一個字符串轉(zhuǎn)換成字節(jié)表示呢?似乎不能直接表示,但是J(ava)script 中的字符串有一個charCodeAt()方法。我們知道單字節(jié)若表示整數(shù),其范圍是 0 -255,雙字節(jié)若表
示正整數(shù),范圍是 0 - 65535。charCodeAt()方法返回的是一個字符的Unicode表示,這種Unicode方案中,中文是兩個字節(jié)的,英文是一個字節(jié)的。所以對于一個英文字符它總是返回0 - 255 之間的正整數(shù),對于一個中文字符,它總是返回 255 - 65535 之間的正整數(shù)(非精確范圍)。
再講一下位運算的知識吧,節(jié)選自微軟的Jscript腳本參考手冊:
對于與運算。 &運算符查看兩個表達式的二進制表示法的值,并執(zhí)行按位“與”操作。該操作的結(jié)果如下所示: 0101 (expression1) 1100 (expression2) ---- 0100 (result) 任何時候,只要兩個表達式的某位都為 1,則結(jié)果的該位為 1。否則,結(jié)果的該位為 0。
對于移位運算,比如右移運算。expression1 >> expression2 中,>> 運算符 把 expression1 的所有位向右移 expression2 指定的位數(shù)。expression1 的符號位被用來填充右移后左邊空出來的位。向右移出的位被丟棄。例如,下面的代碼被求值后,temp 的值是 -4:-14 (即二進制的 11110010)右移兩位等于 -4 (即二進制的 11111100)。 var temp temp = -14 >> 2注:32位整數(shù)類型的數(shù)據(jù)有符號位的問題,對于負數(shù),填充位為1,正數(shù)為0。我們通過charCodeAt()得到的數(shù)都是正數(shù),所以不用管這個問題。
對于一個8位二進制數(shù),與二進制 11110000 相與,再右移4位,則可以得到它的最左四位。 直接與 1111 相與,則可以得到他的右邊四位。
準備知識了解這么多夠了,下面讓我開始實踐編碼。
說,要有一個字符串,于是就有了個字符串。 var strTest = "dknt沒有任何含義"; 我們就是要把這個字符串轉(zhuǎn)化為一個條形碼。
我們要獲得它的二進制表示,那我們就建一個函數(shù)來獲得它的二進制表示。比如 getBinary(); 如: 運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
為了獲得二進制表示,我們要一個字符一個字符的進行,不能著急,首先要獲得每個字符對應的Unicode編碼。 運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
大于 255 的顯然是占用兩個字節(jié)的字符。要想辦法分成單一字節(jié)的兩個數(shù)據(jù),以使程序流易于自動化一些?梢允褂秒p字節(jié)數(shù)值與 二進制 1111111100000000 相與再右移8位來獲得第一個字節(jié)。直接與11111111相與就可以得到第二個字節(jié)的數(shù)據(jù)。使用十六進制數(shù)可能更方便一點。1111111100000000 的十六進制表示為 FF00。11111111顯然就是 FF了。
出處:藍色理想
責任編輯:moby
上一頁 手把手教你做超酷的條形碼效果 [2] 下一頁 手把手教你做超酷的條形碼效果 [4]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|