Dim?b()?As?Byte
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
b?=?System.Text.Encoding.Default.GetBytes(TextBox1.Text)
For?i?=?0?To?UBound(b)
TextBox2.AppendText(i.ToString?&?"?")
Next
End?Sub
Private?Sub?Button2_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button2.Click
TextBox1.Text?=?System.Text.Encoding.Default.GetString(b)
End?Sub
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
TextBox1.Text?=?"Google?free?online?translation?service?instantly?translates?text?and?web?pages。?該翻譯器支持:?中文(簡體),?中文(繁體),?shqip,?日本語,?русский,?langue?fran?aise?..."
End?Sub
End?ClassVB.Net中用String類型表示字符串,內部采用Unicode編碼。當需要在網絡或串口中收發字符串時,就需要在String和Byte數組之間進行轉換,這項功能可以通過System.Text.Encoding類實現。
Private zeroChars()?As Char?=?{ChrW(0)}
Dim descBytes()?As Byte?=?System.Text.Encoding.Unicode.GetBytes(mDescription)
Dim?description As?String?=?System.Text.Encoding.Unicode.GetString(rBuffer,?offset,?length).TrimEnd(zeroChars)
說明:C語言中用'\0'表示字符串結束,而String類型中0是有效字符,顯示時是空白字符,會占用顯示寬度,可以用TrimEnd方法將字符串末尾的零字符去掉。
主要敘說壹下StrConv 函數conversion參數最後兩個值的含義和用途,並舉例說明。
1、語法
StrConv(string, conversion, LCID)
StrConv 函數的語法有下面的命名參數:
部分 說明
string 必要參數。要轉換的字符串表達式。
conversion 必要參數。Integer。其值的和決定轉換的類型。
LCID 可選的。如果與系統LocaleID不同,則為LocaleID(系統LocaleID為缺省值。)
設置值
conversion 參數的設置值為:
常數 值 說明
vbUpperCase 1 將字符串文字轉成大寫。
vbLowerCase 2 將字符串文字轉成小寫。
vbProperCase 3 將字符串中每個字的開頭字母轉成大寫。
vbWide* 4* 將字符串中單字節字符轉成雙字節字符。
vbNarrow* 8* 將字符串中雙字節字符轉成單字節字符。
vbKatakana** 16** 將字符串中平假名字符轉成片假名字符。
vbHiragana** 32** 將字符串中片假名字符轉成平假名字符。
vbUnicode 64 根據系統的缺省碼頁將字符串轉成 Unicode。
vbFromUnicode 128 將字符串由 Unicode 轉成系統的缺省碼頁。
*應用到遠東國別。
**僅應用到日本。
說明:前面3個參數比較簡單,後面4個我們用不上,就不說了,主要說說後面兩個。
2、ANSI 格式
語法中說的缺省碼頁就是ANSI模式,英文環境下 的ANSI 格式其實也就是ASCII碼,其它環境就不壹樣了,比如中文環境,就是ASCII,壹個字節表示壹個字符,GB2312,2個字節表示壹個漢字,所以中文環境下的ANSI格式就是ASCII碼+GB2312,早期的DOS系統中純文本就是這種格式,這種格式下,通過最高位來判斷是中文字符(最高位是1)還是ASCII字符(最高位是0)。中文環境下保存文本文件時壹般都采用ANSI格式,不過也有其他格式,比如UTF-8。
3、Unicode編碼
Unicode(統壹碼、萬國碼、單壹碼)是壹種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統壹並且唯壹的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode用兩個字節表示壹個字符,涵蓋了世界上所有字符,和以前的字符集都不兼容,VB內部字符串就是采用Unicode編碼,所以當我們打開壹個文本文件讀入數據的時候,其內存中的內容和文本文件的內容是不壹樣的,經過了轉換,除非妳采用二進制方式讀入。
4、vbUnicode和vbFromUnicode含義
有了上面敘說,這兩個參數的含義就好理解了,就是Unicode編碼和ANSI編碼的互換,例如:
textline= StrConv(plaintext,vbUnicode)
這兒textline是以字符串變量,plaintext是以字節變量保存著ANSI模式的字符內容,例如,“2”這個字符,壹個字節,值是50,16進制是32,“皖”這個漢字,兩個字節,值是205和238,同樣是這兩個字符,作為字符串在內存中都是兩個字節,例如,“2”這個字符在內存中16進制值是0032。當VB打開壹個文件讀取文本內容是,實際上自動進行了上述轉換。
plaintext?= StrConv(textline,?vbFromUnicode)?
這兒進行相反的轉換,就是將Unicode字符串轉換成ANSI模式,轉換結果必須以字節方式保存。
5、vbUnicode和vbFromUnicode用途
由於字符在內存中的內容和文件中的內容不壹致,所以必須要用到這種轉換,特別是系統間進行數據交換、數據加密和解密,如果不做轉換可能導致得不到正確的結果。
比如,我們對壹個文本文件進行加密,這個文件是ANSI格式存儲的,當從文件內容讀入壹行到內存的時候,自動將內容轉換成了Unicode格式,如果這時候對其做加密運算,其結果和文件中字符串加密結果是不壹樣的,這樣的結果如果讓別人解密將無法得到正確的結果。如果對讀入內存的內容先做個轉換(textline是讀入內容):
plaintext?= StrConv(textline,?vbFromUnicode)?
再對plaintext做加密,其結果就壹樣了。 ?
舉例(按行做加密和解密運算,算法是AES+Base64):
[vb]?view plain?copy?
Status?=?"Encrypting?File"?
Open?FileName?For?Input?As?#1?'?打開輸入文件。?
Open?FileName2?For?Output?As?#2?'?打開輸出文件。?
Do?While?Not?EOF(1)?
Line?Input?#1,?TextLine?
plaintext?=?StrConv(TextLine,?vbFromUnicode)?
Status?=?"Encrypting?Data"?
m_Rijndael.SetCipherKey?pass,?KeyBits?
m_Rijndael.ArrayEncrypt?plaintext,?ciphertext,?0?
Status?=?"Converting?Text?to?Base64"?
TextLine?=?Base64Encode(ciphertext)?
Status?=?""?
Print?#2,?TextLine'?將字符串寫入文件。?
Loop?
Close?
[vb]?view plain?copy?
Status?=?"Decrypting?File"?
Open?FileName?For?Input?As?#1?'?打開輸入文件。?
Open?FileName2?For?Output?As?#2'?打開輸出文件。?
Do?While?Not?EOF(1)?
Line?Input?#1,?TextLine?
Status?=?"Converting?Base64?to?Text"?
ciphertext?=?Base64Decode(TextLine)?
Status?=?"Decrypting?Data"?
m_Rijndael.SetCipherKey?pass,?KeyBits?
If?m_Rijndael.ArrayDecrypt(plaintext,?ciphertext,?0)?<>?0?Then?
Status?=?""?
Exit?Sub?
End?If?
TextLine?=?StrConv(plaintext,?vbUnicode)?
For?i?=?0?To?UBound(plaintext)?
Debug.Print?plaintext(i)?
Next?i?
k?=?InStr(1,?TextLine,?Chr(0),?vbBinaryCompare)?
If?k?>?0?Then?TextLine?=?Left(TextLine,?k?-?1)'截掉加密時補的0?
MsgBox?TextLine?&?"end"?
Status?=?""?
Print?#2,?TextLine'?將字符串寫入文件。?
Loop?
Close?