官术网_书友最值得收藏!

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對應的正是“啊”字。

主站蜘蛛池模板: 昌都县| 兴山县| 乐平市| 大余县| 咸阳市| 婺源县| 镇原县| 韶山市| 思茅市| 东辽县| 昭觉县| 大城县| 佛山市| 阿克陶县| 明溪县| 泸定县| 遂溪县| 嘉祥县| 康马县| 巴塘县| 慈溪市| 肇源县| 清水河县| 贵德县| 雷州市| 泗洪县| 遂昌县| 保定市| 滦南县| 平泉县| 汉源县| 大悟县| 柳林县| 白朗县| 连云港市| 仙居县| 大荔县| 宁明县| 启东市| 益阳市| 平罗县|