- 深入解析ASP核心技術
- 王洪影
- 1577字
- 2019-01-03 18:15:46
2.1.5 常用的轉換函數
1. 字符與數字的轉換
Asc函數返回與字符對應的編碼數字,Chr函數則反之,根據編碼數字返回與之對應的字符。轉換的對應關系如圖2-2所示。

圖2-2 字符與數字的轉換關系圖
應該注意到,這兩個函數只是改變了數據類型,內存存儲并沒有發(fā)生變化,而且轉換雙方的內存占用的都是兩個字節(jié)。
這兩個函數概括起來就是一句話:字符就是數字,數字就是字符。
2. 字節(jié)與數字的轉換
AscB和ChrB函數的作用類似,只是它們的作用范圍是字節(jié),而不是字符。轉換的對應關系如圖2-3所示。

圖2-3 字節(jié)與數字的轉換關系圖
AscB函數根據字符的第一個字節(jié)返回對應的數字,它返回的是一個Byte類型。ChrB函數是根據數字返回對應字符,但是,它返回的是一個單字節(jié)字符,它的數據類型是String,但是只有一個字節(jié)。
要注意理解Chr和ChrB兩個函數的區(qū)別,前者返回一個字符,它是Unicode編碼的,總是占用兩個字節(jié),后者則返回一個字節(jié)。Chr函數的參數是在0~65535之間,而ChrB函數的參數只能在0~255之間。
ChrB函數的參數類型可以是Byte、Integer或者Long,這個對結果沒有絲毫影響,因為該函數只使用參數的第一個字節(jié)。
這兩個函數概括起來說,AscB函數是截取字符串的第一個字節(jié),ChrB函數則將一個字節(jié)還原為字符串。主要作用還是轉換類型,這一個字節(jié)的數據存儲本身并沒有改變。
3. 其他常見函數
其他一些可能用到的函數就是LeftB、MidB、RightB、LenB、InstrB等一些以字節(jié)為單位進行操作的函數,都比較好理解,不再細說。
還有兩個函數容易讓人困惑,就是AscW和ChrW。其實不難理解,在使用這兩個函數進行字符和數字轉換時,這個數字始終是指字符的Unicode編碼數字,而使用Asc和Chr函數時,數字是指GBK、BIG5或SHIFT_JIS等編碼數字,具體是哪個編碼,取決于程序控制。
舉一個例子,如漢字“啊”字的GBK編碼是B0A1, Unicode編碼是554A,幾個函數的轉換結果如表2-4所示。
表2-4 轉換舉例

Asc和AscW函數可能返回負值,如Asc("啊")返回的就是-20319。很多人都知道處理方法是在這個數字上加上65536,下面就來分析一下為何要這樣做。
字符“啊”的GBK編碼是B0 A1,即十進制的45217。Asc和AscW函數的返回類型是Integer,它最大只能表示32767。
相關數字的二進制形式如表2-5所示。
表2-5 數字為Integer型時的二進制形式

在Integer數據類型中,最高位的1個比特是用來表示正負的,0表示正數,1表示負數。數字45217的二進制形式最高位是1,這個二進制形式單獨說說當然是沒問題的,但是當把它作為Integer類型處理時,它就成了-20319。
補救方法就是把數據類型轉換為Long型,這兩個數字為Long型時的二進制形式如表2-6所示。
表2-6 數字為Long型時的二進制形式

要把Long型的-20319變?yōu)?5217,其實就是要把左邊兩個字節(jié)的1全變?yōu)?。其實,首先想到的應該是“位與”操作,即按位進行與操作。
b = CLng(-20319) d = b AND &H0000FFFF& response.write d
前兩個字節(jié)用0進行與操作,結果一定是0,后兩個字節(jié)用1進行與操作,結果一定和原數據一致。于是,清晰明了地實現了前兩個字節(jié)置0的操作。
而給-20319加上65536,其實是有點取巧的方法,在第二個字節(jié)的最后一位加上1,結果為0,并向前進位,如此類推,直到最后一個進位溢出,從而實現前兩個字節(jié)的置0。
還有一種方式,是利用Hex函數,如CLng("&H" & Hex(-20319)),也會得到正確結果。
4. 字節(jié)數組與BSTR
在一些編程語言中是有字節(jié)數組的這個概念的(如Java中是byte[])。在VBScript中,是無法直接創(chuàng)建字節(jié)數組的。各位可能會想,創(chuàng)建一個數組,然后在每個元素中放入一個字節(jié)數據不就可以了嗎?看一下例子。
Dim x(2) x(0)=Cbyte(60) x(1)=cbyte(61) x(2)=cbyte(62) response.write typename(x) &"<br>" response.write vartype(x) &"<br>"
輸出的是 Variant()和8204,說明它只是一個變量數組,而非字節(jié)數組。真正的字節(jié)數組,應該輸出為Byte()和8209。
想要創(chuàng)建字節(jié)數組,只能依靠一些組件(如Adodb.Stream)的幫助,使用Request. BinaryRead方法所讀取的表單數據也是字節(jié)數組。
在很多程序中,會使用多個ChrB()拼接,從而得到一個字符串,它的實際內存存儲是對應的字節(jié)數據,本書將這種字符串稱為二進制字符串,簡寫為BSTR。
一個ChrB()返回的是一個字節(jié)的數據,即使輸出也是亂七八糟的字符,但是多個ChrB()的字節(jié)連起來就不同了。如下面兩行代碼效果是一樣的:
response.write chrB(&H4A) & chrB(&H55&) &"<br>" response.write "啊" & "<br>"
兩個字節(jié)的數據連起來,4A 55對應的正是“啊”字。