標籤:style blog http color 使用 os strong ar
分析問題
字串和位元組數組之間的轉換,事實上代表了現實世界資訊和數字世界資訊之間的轉換,要理解其中的機制,需要先瞭解一下幾個概念。
1、位元。
位元(bit)是指一個位,它可以說是電腦內物理儲存的最近本單元。現在的電腦體系採用二進位邏輯,即一個基本單元可以儲存兩種數值:0和1。這是因為0、1機制可以用多種物理系統來表示,例如高電平和低電平、二極體的導通和關閉、磁場的正極和負極等。總之,一個位元就是一個二進位位。
2、位元組。
一個位元組(byte),在C#中是由8個位元來構成的。它的值可以有一個0~255的正數表示,但在C#中不允許隱式地把一個正數變數賦值給一個位元組變數,下面的代碼將導致編譯的錯誤:
int i=10;int j=0;byte b=i-j;
3、編碼。
編碼,可說是數字資訊和現實資訊的轉行機制。一種編碼通常就定義了一種字元集合轉換的原則,常用的編碼方式包括UTF8、GB2312、UTF7、Unicode等,在UTF-8中,字元採用1~6個8位元位元組的序列進行編碼。僅僅8位元位元組的序列中,位元組的高位為0,其他的7位用於字元值編碼。n(n>1)個8位元位元組的一個序列中,初始的8位元位元組中高n位為1,接著一位為0,此位元組餘下的位包含被編碼字元值的位。接著的所有8位元位元組的最高位為1,接著下一位為0,餘下的每個位元組6位包含被編碼字元的位。
展示了位元、位元組、編碼和字串的關係。
根據定義,位元組數組和字串的轉換必然涉及使用某種編碼方法。不同的編碼方式將導致不同的轉換結果。在C#中,使用System.Text.Encoding來管理常用的編碼。以下代碼展示了如何在位元組數組和字串之間進行轉換。
using System;using System.Text;namespace Test{ class StringByte { static void Main() { string str= "I am a string"; //A byte array into a string. //UTF8 encoding. byte[] utf8 = StringToByte(str, Encoding.UTF8); //GB2312 encoding byte[] gb2312 = StringToByte(str, Encoding.GetEncoding("GB2312")); //Unicode encoding byte[] unicode = StringToByte(str, Encoding.Unicode); Console.WriteLine(utf8.Length); Console.WriteLine(gb2312.Length); Console.WriteLine(unicode.Length); //Convert back to a string Console.WriteLine(ByteToString(utf8,Encoding.UTF8)); Console.WriteLine(ByteToString(gb2312,Encoding.GetEncoding("GB2312"))); Console.WriteLine(ByteToString(unicode,Encoding.Unicode)); Console.Read(); } //Convert a string to a byte array. static byte[] StringToByte(string str, Encoding encoding) { return encoding.GetBytes(str); } //Convert a byte array to a string static string ByteToString(byte[] byteArray,Encoding encoding) { return encoding.GetString(byteArray); } }}
以上程式展示了如何利用三種常見的編碼方式把字串轉換成位元組數組,接著再轉換回字串。程式中間檢查了位元組數組的長度,讀者可以看到利用不同的編碼方式產生的位元組數組是完全不同的。對於具體的編碼定義,有興趣的讀者可以參考ISO和RFC的標準文檔。下面是程式的執行結果:
答案
字串和位元組數組的轉換依賴於編碼方式的使用,不同的編碼通訊協定將使用不同的演算法進行。System.Text.Encoding類型提供了大部分常見的編碼演算法支援,用以進行字串和位元組數組之間的轉換。