J(ava)script中,用0x前綴表示十六進制數(shù)。我們可以實踐一下下面的代碼。
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
可以看到現(xiàn)在每個數(shù)都是小于255的了。
注意,(iDecimalUnicode & 0xFF00) >> 8 中,>> 的優(yōu)先級比 & 高,所以按照我們的目的,(iDecimalUnicode & 0xFF00) 一定要有括號。
我們希望能有個統(tǒng)一的處理邏輯,把每個字節(jié)分成兩部分,每個部分用十六進制的1位就可以表示,換句話說,就是每部分都是一個不超過16的十進制數(shù)。類似Ruby中的代碼段數(shù)據(jù)類型,在J(ava)script中,也可以用匿名函數(shù)來實現(xiàn)類似的功能。我們可以建一個名為tmpOP變量來承接這個匿名函數(shù),然后利用它來簡化程序邏輯。此外,我們應(yīng)該有個東西來儲存分解出來的結(jié)果。那就用個result數(shù)組來裝吧。另外按照語義,我們這個函數(shù)做的已經(jīng)不僅僅是轉(zhuǎn)化二進制了,而是轉(zhuǎn)化成意義上的十六進制位了。我們應(yīng)該是恨敏捷的,所以把函數(shù)名改成getHexes吧。
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
很高興看到現(xiàn)在就彈出一個alert吧,剛才那么多alert是很鬧心。我很抱歉。這次因為我們使用了alert一個數(shù)組,感覺整齊一點。
現(xiàn)在發(fā)現(xiàn)數(shù)組的每一個元素都是小于16了吧,很好,大象快裝進去了。
有一個問題,我們不能把字符串的每個字符都轉(zhuǎn)化成條形碼,若是一個1萬多字的文章怎么辦,那不扯呢嗎。所以我們要限制一下處理的字符數(shù)。以條形碼的視點來看,似乎寬度應(yīng)該是固定的,也就是說我們用以對應(yīng)的 aResult 數(shù)組的長度應(yīng)該是固定的。那也好辦,在我們的 tmpOP 里控制一下就行了。我們可以假設(shè)我們只需要8個十六進制位來生成條形碼?梢栽趃etHexes里加一個 iMaxLength 參數(shù)來控制。 如下:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
現(xiàn)在確實只有8個小于16的數(shù)了。
在 tmpOP 中,發(fā)現(xiàn) aResult 數(shù)組的長度超過最大值,就返回一個0,外面發(fā)現(xiàn)這個0以后,就直接退出循環(huán),因為沒有必要再繼續(xù)往下取字符了。
有些地方略顯不妥,本著精益求精的精神,我們要把我們的程序效率提高提高。首先,我們知道了位相與的目的,就可以寫一些更直接處理的代碼,因為我們把處理雙字節(jié)時,為了分成兩個單字節(jié),實際上多與運算了一次,和后面的分解雙十六進制位有重復的位相與。說俗了就是多干了一次沒用的事。不如一次就分解出4個十六進制位。
此外,我們總是向數(shù)組詢問length屬性來獲知數(shù)組長度,要知道數(shù)組做這件事是很累的,反正我們也有條件自己心理有數(shù),為什么還要總問它呢。
基于這兩點,我們把程序改動如下:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
看到了效果跟上一個是一樣的,說明我們沒改錯。其中,aPos數(shù)組就可以儲存掩碼,數(shù)組的索引 X 4 就是需要右移的位數(shù)。tmpOP( iDecimalUnicode , i) 就表示取 iDecimalUnicode 從右邊數(shù)第i個十六進制位(第0個就是最右邊的1個十六進制位)。
大象是勉勉強強塞進去了,下面我們就把活做的利索點,把冰箱門兒帶上。要不條形碼還沒露面,我們怎么收場?
出處:藍色理想
責任編輯:moby
上一頁 手把手教你做超酷的條形碼效果 [3] 下一頁 手把手教你做超酷的條形碼效果 [5]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|