本文的討論也將著眼于這兩種情況 首先是當(dāng)程序員需要?jiǎng)討B(tài)建立一個(gè)控件并將代碼附著于控件之上時(shí) 例如 你或許想創(chuàng)建一個(gè)鏈接列表 但是不知道需要?jiǎng)?chuàng)建鏈接的數(shù)量或是鏈接中會(huì)出現(xiàn)什么樣的數(shù)據(jù) 第二種是當(dāng)程序員需要定義代碼以反映出特殊需求的時(shí)候 例如 你或許要執(zhí)行能反映用戶系統(tǒng)配置的代碼
創(chuàng)新互聯(lián)建站-成都網(wǎng)站建設(shè)公司,專注成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷推廣,國(guó)際域名空間,虛擬空間,網(wǎng)站托管運(yùn)營(yíng)有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請(qǐng)聯(lián)系創(chuàng)新互聯(lián)建站。
類似上述的情況當(dāng)然不會(huì)每天都上演 事實(shí)上 它們只在非常情況下才出現(xiàn) 然而 作為程序員 仍然要意識(shí)到 NET為解決動(dòng)態(tài)情形提供了方案 有了正確的技巧 你就可以寫出能靈活處理動(dòng)態(tài)情況的應(yīng)用程序了
使用動(dòng)態(tài)控件
許多程序員總會(huì)遇到需要?jiǎng)討B(tài)創(chuàng)建控件的時(shí)候 我們所展示的例子中程序員向FlowLayoutPanel中添加了LinkLabels 或許你可以個(gè)這樣的設(shè)置來記錄和保存常用的URL 文件 網(wǎng)絡(luò)地址或是其他資源所在位置的數(shù)值 這一示例沒有真正保存鏈接 但是你可以使用XML序列化功能來實(shí)現(xiàn)保存
每次當(dāng)用戶點(diǎn)擊Test按鈕時(shí) 示例代碼就會(huì)動(dòng)態(tài)創(chuàng)建一個(gè)新的LinkLabel控件 真正的演示代碼并不復(fù)雜 例一就展示了創(chuàng)建這類控件以及將控件放入FlowLayoutPanel lstLabel中通常所需要做的一切
例一 向FlowLayoutPanel中添加新的鏈接 ?Private Sub btnTest_Click() Handles btnTest Click Create a link Dim NewLink As LinkLabel =New LinkLabel() Add some properties to it NewLink Text = DateTime Now ToLongTimeString() Set the click event handler AddHandler NewLink Click AddressOf NewLink_Click Place the button on the form lstLinks Controls Add(NewLink) End Sub
如你所料 該代碼開始的時(shí)候創(chuàng)建了一個(gè)新的LinkLabel并為其賦予了一些值 這一示例使用的是當(dāng)前時(shí)間 你的代碼或許能夠?qū)δ骋徽鎸?shí)資源進(jìn)行訪問
請(qǐng)注意該代碼也向鏈接的Click事件中指定了一個(gè)處理程序 你必須使用示例中的AddHandler技巧 因?yàn)槠胀ǖ腍andles關(guān)鍵詞路徑不起作用 一方面 設(shè)計(jì)應(yīng)用程序的時(shí)候你并不清楚控件的名稱 即便你為控件指定了一個(gè)名稱 你也不知道用戶要?jiǎng)?chuàng)建的控件數(shù)量 所以我們沒有辦法清楚會(huì)有多少處理程序會(huì)被創(chuàng)建 處理程序的代碼與控件代碼類似 因此沒有必要?jiǎng)?chuàng)建多個(gè)處理程序 用于這個(gè)示例的處理代碼見例二 例二 處理動(dòng)態(tài)控件點(diǎn)擊事件 ?Private Sub NewLink_Click( _ ByVal sender As System Object ByVal e As System EventArgs) Verify that you actually have a LinkLabelIf Not sender GetType() Is GetType(LinkLabel) ThenMessageBox Show( Wrong control type provided! )ReturnEnd If Convert the input sender to a Button Dim ThisLink As LinkLabel = sender Show that we have the correct button MessageBox Show( You created this link at: + ThisLink Text)End Sub
你可能已經(jīng)注意到例一中的事件處理器使用的是寬松代表——它沒有將ByVal發(fā)送器作為System Object 也沒有將ByVal e作為System EventArgs作為參數(shù)因?yàn)樗恍枰@二者 然而 當(dāng)你創(chuàng)建一個(gè)事件處理器來動(dòng)態(tài)創(chuàng)建控件時(shí) 通常你需要將ByVal發(fā)送器作為System Object參數(shù) 這意味著將這兩者都包含其中
有些程序員在創(chuàng)建事件處理器的時(shí)候會(huì)出現(xiàn)一個(gè)錯(cuò)誤 即沒有檢查傳入控件的類型 發(fā)送器對(duì)象可能包含多選擇 而如果未對(duì)事件處理器進(jìn)行事件處理類型的設(shè)置 那么你就會(huì)面臨更多的選擇 我們的示例代碼一開始就檢查了傳入控件對(duì)象的類型 這樣以來發(fā)送器就不會(huì)像下面所展示的代碼一樣 ?Private Sub btnTest _Click() Handles btnTest Click Create a link Dim NewButton As Button = New Button() Add some properties to it NewButton Text = DateTime Now ToLongTimeString() Set the click event handler AddHandler NewButton Click AddressOf NewLink_Click Place the button on the form lstLinks Controls Add(NewButton)End Sub
此代碼在FlowLayoutPanel中創(chuàng)建了一個(gè)按鈕 大多數(shù)情況下這都能正常運(yùn)行 除非事件處理器不按照按鈕所示的進(jìn)行操作 如果你打算服務(wù)多個(gè)控件類型 那么每個(gè)控件類型都需要一個(gè)獨(dú)特的處理 你可以使用多事件處理器或者為某些類型提供選擇標(biāo)準(zhǔn)
NewLink_Click()事件處理器照常將傳入發(fā)送器轉(zhuǎn)換成指定類型 在這個(gè)示例中則是LinkLabel 該代碼可以訪問LinkLabel屬性并能用其他方式進(jìn)行互動(dòng) 在我們的示例中 只顯示了一個(gè)能在創(chuàng)建鏈接的時(shí)候告知我們的對(duì)話框
使用動(dòng)態(tài)代碼
在運(yùn)行時(shí)創(chuàng)建一個(gè)控件是在無(wú)法確定應(yīng)用程序功能的時(shí)候采取的一種策略 但是動(dòng)態(tài)創(chuàng)建控件并不適用于所有的情況 有些時(shí)候你必須建立可執(zhí)行代碼 雖然你的應(yīng)用程序運(yùn)行的目的是補(bǔ)償不同極其之間的配置 不同用戶的需求 不同的環(huán)境需求或是其他要求 當(dāng)應(yīng)用程序所運(yùn)行的電腦不存在控件 那么通常是需要?jiǎng)?chuàng)建動(dòng)態(tài)代碼的
幸運(yùn)的是 NET為我們提供了一系列動(dòng)態(tài)代碼選項(xiàng) 例如 你可以創(chuàng)建一個(gè)可執(zhí)行的能獨(dú)立運(yùn)行的程序或是可以想運(yùn)行中的程序加載一個(gè)DLL然后再執(zhí)行 當(dāng)你需要演示一個(gè)外部任務(wù)的時(shí)候可以使用選擇可執(zhí)行 如運(yùn)行一種腳本——該DLL選項(xiàng)最適合擴(kuò)大現(xiàn)有的應(yīng)用程序功能
你可以運(yùn)行來自文件或內(nèi)存的動(dòng)態(tài)代碼 當(dāng)你需要不止一次地運(yùn)行代碼時(shí) 可以使用文件 對(duì)代碼的檢查可以再次運(yùn)行外部文件而不需要對(duì)其進(jìn)行二次編譯 當(dāng)你需要多次演示任務(wù)的時(shí)候 如一個(gè)安裝請(qǐng)求 那可以使用內(nèi)存圖像
當(dāng)然我們也可以更改源代碼 例如 你可以使用字符串來建立需要在應(yīng)用程序中直接使用的代碼 如果你需要代碼具有高度靈活性 且代碼本身不是很長(zhǎng)時(shí) 這一方法的優(yōu)勢(shì)就非常顯著 也可以從文件里建立代碼 就如同VS一樣 這一方法最適用于相對(duì)穩(wěn)定且不需要復(fù)雜編碼的需求 第三種選擇是使用Documentation Object Model來創(chuàng)建代碼并將其作為CodeDom樹型結(jié)構(gòu)的一個(gè)系列 該樹型結(jié)構(gòu)包括了CodeCormpileUnits 這就像是用DOM模式創(chuàng)建了一個(gè)XML文件
使用動(dòng)態(tài)創(chuàng)建代碼的最好方式是用示例來檢查一下 例三展示了一個(gè)基本 Hello World 示例 該示例用源代碼直接創(chuàng)建了代碼因此你可以看到整個(gè)運(yùn)行以及生成一個(gè)外部可執(zhí)行文件的過程
例三 動(dòng)態(tài)編碼示例 ?Private Sub btnTest _Click() Handles btnTest Click Create a piler Dim Comp As VBCodeProvider = New VBCodeProvider() Define the parameters for the code you want to pile Dim Parms As CompilerParameters = New CompilerParameters) We do want to create an executable rather than a DLL Parms GenerateExecutable = True The piler will create an output assembly called Output Parms OutputAssembly = Output The piler won t treat warnings as errors Parms TreatWarningsAsErrors = False Add any assembly you want to reference Parms ReferencedAssemblies Add( System Windows Forms dll ) Define the code you want to run Dim SampleCode As StringBuilder = New StringBuilder() SampleCode Append( Imports System Windows Forms + vbCrLf) SampleCode Append( Module TestAssembly + vbCrLf) SampleCode Append( Sub Main() + vbCrLf) SampleCode Append( MessageBox Show( + Chr( ) + _ Dynamically Created Code! + _Chr( ) + ) + vbCrLf)SampleCode Append( End Sub + vbCrLf)SampleCode Append( End Module + vbCrLf) Define the code to run Dim Executable As CompilerResults = _ Comp CompileAssemblyFromSource(Parms SampleCode ToString()) Display error messages if there are any If Executable Errors HasErrors ThenFor Each Item As CompilerError In Executable ErrorsMessageBox Show(Item ErrorText)NextElse If there aren t any error messages start the executable Process Start( Output )End IfEnd Sub
一開始你創(chuàng)建了一個(gè)使用VBCodeProvider的編譯器Comp 舊一點(diǎn)的 NET版本使用的是不同的方法但是這里所講的是微軟推薦的一個(gè)新方法
為了使用編譯器 你必須創(chuàng)建能描述應(yīng)用程序的參數(shù) 這些參數(shù)類似于VS中你創(chuàng)建的參數(shù) 只是現(xiàn)在你可以對(duì)它們進(jìn)行定義 該代碼一開始就將GenerateExecutable設(shè)置為True 這意味著你需要的是一個(gè)EXE文件而不是DLL
Parms OutputAssembly屬性包含了輸出文件的名稱 你只需要在想創(chuàng)建文件時(shí)提供這一信息即可 而不需要生成可執(zhí)行內(nèi)存了 如果你ixiang生成可執(zhí)行文件的內(nèi)存版本 可以將Parm GenerateInMemory屬性設(shè)置為True
使用Parm TreatWarningsAsErrors屬性來確定如何處理警告信息 默認(rèn)的設(shè)置會(huì)使其為錯(cuò)誤 這意味著你的應(yīng)用程序可能無(wú)法對(duì)其進(jìn)行編譯 大多數(shù)程序員使用默認(rèn)設(shè)置 盡管他們開發(fā)了程序 但是在開發(fā)完成的程序中卻將其設(shè)置為False
大多數(shù)應(yīng)用程序需要外部DLL以正常運(yùn)行 當(dāng)然 你不能創(chuàng)建任意的沒有引用外部DLL的Windows表單程序 通常 你要使用Reference文件夾來完成這一任務(wù) 不過 當(dāng)你動(dòng)態(tài)創(chuàng)建代碼的時(shí)候可以依賴于Parms ReferencedAssemblies屬性 如下所示 只需添加你要的DLL即可
現(xiàn)在 你已經(jīng)定義了項(xiàng)目 接下來需要為其創(chuàng)建源代碼 如前文所述 你可以依賴于一個(gè)外部文件或DOM模式 然后 該示例創(chuàng)建了代碼因此你可以看到整個(gè)過程 下面是代碼的原始形式 ?Imports System Windows Forms Module TestAssemblySub Main()MessageBox Show( Dynamically Created Code! )End SubEnd Module
這個(gè)簡(jiǎn)單的例子顯示了一個(gè)對(duì)話框 注意vbCrLf的使用 如果你不使用這一方法 那編譯器會(huì)發(fā)送給你一個(gè)錯(cuò)誤信息 vbCrLf條目在該代碼中所起的作用與在程序代碼中的作用相同 只是添加的方式不一樣
從這一點(diǎn)老說 你最后會(huì)用Comp CompileAsseblyFromSource()方法編譯代碼 當(dāng)使用DOM模式和文件的時(shí)候可以使用這一方法 而在所有三種情況中 編譯器用參數(shù)和源代碼創(chuàng)建了你請(qǐng)求的輸出 該運(yùn)算的輸出出現(xiàn)在Executable中 是CompilerResults類型
編譯的失敗次數(shù)多于程序員的預(yù)計(jì) 無(wú)論你是在哪里使用動(dòng)態(tài)編碼技巧 你必須假設(shè)會(huì)出現(xiàn)失敗的情況以及處理失敗的方案 在本例中 代碼尋找的是錯(cuò)誤并在編譯失敗時(shí)將其展示在了信息框中 否則 代碼會(huì)依賴于Process Start()方法來啟用可執(zhí)行文件
底線
動(dòng)態(tài)編碼技巧并不是萬(wàn)能鑰匙 當(dāng)你為開發(fā)問題找到了好的靜態(tài)解決方案時(shí) 當(dāng)然也可以使用 但是在我們所列出的情況中沒有可行的靜態(tài)方案 因此要選擇動(dòng)態(tài)編碼技巧 大多數(shù)情況下 要用動(dòng)態(tài)編碼技巧解決以下問題
◆ 用戶的環(huán)境會(huì)以不可預(yù)見的方式更改時(shí)
◆ 無(wú)法控制用戶電腦的安裝
◆ 用戶或應(yīng)用程序都添加了你要用控件執(zhí)行的數(shù)據(jù)要素
◆ 應(yīng)用程序必須執(zhí)行很早以前的安裝任務(wù) 且這些任務(wù)與電腦 環(huán)境 網(wǎng)絡(luò)或其他不確定因素聯(lián)系緊密時(shí)
◆ 應(yīng)用程序要執(zhí)行了處理級(jí)別的任務(wù) 且這些任務(wù)取決于機(jī)器連接或其他狀況
lishixinzhi/Article/program/ASP/201311/21812
Public?Class?Form1
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。?該翻譯器支持:?中文(簡(jiǎn)體),?中文(繁體),?shqip,?日本語(yǔ),?русский,?langue?fran?aise?..."
End?Sub
End?ClassVB.Net中用String類型表示字符串,內(nèi)部采用Unicode編碼。當(dāng)需要在網(wǎng)絡(luò)或串口中收發(fā)字符串時(shí),就需要在String和Byte數(shù)組之間進(jìn)行轉(zhuǎn)換,這項(xiàng)功能可以通過System.Text.Encoding類實(shí)現(xiàn)。
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語(yǔ)言中用'\0'表示字符串結(jié)束,而String類型中0是有效字符,顯示時(shí)是空白字符,會(huì)占用顯示寬度,可以用TrimEnd方法將字符串末尾的零字符去掉。
主要敘說一下StrConv 函數(shù)conversion參數(shù)最后兩個(gè)值的含義和用途,并舉例說明。
1、語(yǔ)法
StrConv(string, conversion, LCID)
StrConv 函數(shù)的語(yǔ)法有下面的命名參數(shù):
部分 說明
string 必要參數(shù)。要轉(zhuǎn)換的字符串表達(dá)式。
conversion 必要參數(shù)。Integer。其值的和決定轉(zhuǎn)換的類型。
LCID 可選的。如果與系統(tǒng)LocaleID不同,則為L(zhǎng)ocaleID(系統(tǒng)LocaleID為缺省值。)
設(shè)置值
conversion 參數(shù)的設(shè)置值為:
常數(shù) 值 說明
vbUpperCase 1 將字符串文字轉(zhuǎn)成大寫。
vbLowerCase 2 將字符串文字轉(zhuǎn)成小寫。
vbProperCase 3 將字符串中每個(gè)字的開頭字母轉(zhuǎn)成大寫。
vbWide* 4* 將字符串中單字節(jié)字符轉(zhuǎn)成雙字節(jié)字符。
vbNarrow* 8* 將字符串中雙字節(jié)字符轉(zhuǎn)成單字節(jié)字符。
vbKatakana** 16** 將字符串中平假名字符轉(zhuǎn)成片假名字符。
vbHiragana** 32** 將字符串中片假名字符轉(zhuǎn)成平假名字符。
vbUnicode 64 根據(jù)系統(tǒng)的缺省碼頁(yè)將字符串轉(zhuǎn)成 Unicode。
vbFromUnicode 128 將字符串由 Unicode 轉(zhuǎn)成系統(tǒng)的缺省碼頁(yè)。
*應(yīng)用到遠(yuǎn)東國(guó)別。
**僅應(yīng)用到日本。
說明:前面3個(gè)參數(shù)比較簡(jiǎn)單,后面4個(gè)我們用不上,就不說了,主要說說后面兩個(gè)。
2、ANSI 格式
語(yǔ)法中說的缺省碼頁(yè)就是ANSI模式,英文環(huán)境下 的ANSI 格式其實(shí)也就是ASCII碼,其它環(huán)境就不一樣了,比如中文環(huán)境,就是ASCII,一個(gè)字節(jié)表示一個(gè)字符,GB2312,2個(gè)字節(jié)表示一個(gè)漢字,所以中文環(huán)境下的ANSI格式就是ASCII碼+GB2312,早期的DOS系統(tǒng)中純文本就是這種格式,這種格式下,通過最高位來判斷是中文字符(最高位是1)還是ASCII字符(最高位是0)。中文環(huán)境下保存文本文件時(shí)一般都采用ANSI格式,不過也有其他格式,比如UTF-8。
3、Unicode編碼
Unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。Unicode用兩個(gè)字節(jié)表示一個(gè)字符,涵蓋了世界上所有字符,和以前的字符集都不兼容,VB內(nèi)部字符串就是采用Unicode編碼,所以當(dāng)我們打開一個(gè)文本文件讀入數(shù)據(jù)的時(shí)候,其內(nèi)存中的內(nèi)容和文本文件的內(nèi)容是不一樣的,經(jīng)過了轉(zhuǎn)換,除非你采用二進(jìn)制方式讀入。
4、vbUnicode和vbFromUnicode含義
有了上面敘說,這兩個(gè)參數(shù)的含義就好理解了,就是Unicode編碼和ANSI編碼的互換,例如:
? ? ? textline= StrConv(plaintext,vbUnicode) ?
這兒textline是以字符串變量,plaintext是以字節(jié)變量保存著ANSI模式的字符內(nèi)容,例如,“2”這個(gè)字符,一個(gè)字節(jié),值是50,16進(jìn)制是32,“皖”這個(gè)漢字,兩個(gè)字節(jié),值是205和238,同樣是這兩個(gè)字符,作為字符串在內(nèi)存中都是兩個(gè)字節(jié),例如,“2”這個(gè)字符在內(nèi)存中16進(jìn)制值是0032。當(dāng)VB打開一個(gè)文件讀取文本內(nèi)容是,實(shí)際上自動(dòng)進(jìn)行了上述轉(zhuǎn)換。
? ? ?plaintext?= StrConv(textline,?vbFromUnicode)
這兒進(jìn)行相反的轉(zhuǎn)換,就是將Unicode字符串轉(zhuǎn)換成ANSI模式,轉(zhuǎn)換結(jié)果必須以字節(jié)方式保存。
5、vbUnicode和vbFromUnicode用途
由于字符在內(nèi)存中的內(nèi)容和文件中的內(nèi)容不一致,所以必須要用到這種轉(zhuǎn)換,特別是系統(tǒng)間進(jìn)行數(shù)據(jù)交換、數(shù)據(jù)加密和解密,如果不做轉(zhuǎn)換可能導(dǎo)致得不到正確的結(jié)果。
比如,我們對(duì)一個(gè)文本文件進(jìn)行加密,這個(gè)文件是ANSI格式存儲(chǔ)的,當(dāng)從文件內(nèi)容讀入一行到內(nèi)存的時(shí)候,自動(dòng)將內(nèi)容轉(zhuǎn)換成了Unicode格式,如果這時(shí)候?qū)ζ渥黾用苓\(yùn)算,其結(jié)果和文件中字符串加密結(jié)果是不一樣的,這樣的結(jié)果如果讓別人解密將無(wú)法得到正確的結(jié)果。如果對(duì)讀入內(nèi)存的內(nèi)容先做個(gè)轉(zhuǎn)換(textline是讀入內(nèi)容):
? ? ?plaintext?= StrConv(textline,?vbFromUnicode)
再對(duì)plaintext做加密,其結(jié)果就一樣了。
舉例(按行做加密和解密運(yùn)算,算法是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)????'截掉加密時(shí)補(bǔ)的0
MsgBox?TextLine??"end"
Status?=?""
Print?#2,?TextLine????'?將字符串寫入文件。
Loop
Close
GB2312是GBK編碼的子集,使用GBK編碼函數(shù)即可
'GBK編碼(結(jié)果以百分號(hào)%進(jìn)行分隔)
Public Function GBKEncode(ByVal sInput As String) As String
Dim ret_GBKEncode As String = ""
Dim i As Integer
Dim startIndex As Integer = 0
Dim endIndex As Integer
Dim x() As Byte = System.Text.Encoding.Default.GetBytes(sInput) '字符以及字符串在vb2008中都是以u(píng)nicode編碼存儲(chǔ)的
endIndex = x.Length - 1
For i = startIndex To endIndex
ret_GBKEncode = "%" Hex(x(i))
Next
Return ret_GBKEncode
End Function
'GBK解碼
Public Function GBKDecode(ByVal sInput As String) As String
sInput = sInput.Replace("%", "")
Dim ret_GBKDecode As String = ""
Dim sLen As Integer = sInput.Length
Dim n As Integer = sLen \ 2
Dim sBytes(0 To n - 1) As Byte
'轉(zhuǎn)化為字節(jié)碼
For i As Integer = 1 To n
sBytes(i - 1) = CByte("H" sInput.Substring(2 * i - 2, 2))
Next
'將字節(jié)碼轉(zhuǎn)化為字符串
ret_GBKDecode = System.Text.Encoding.Default.GetString(sBytes)
Return ret_GBKDecode
End Function