Visual C# 2005 - 讀者來函照刊

摘要:Visual C# 2005 - 讀者來函照刊

原發問問題: 

作者您好,有一點沒搞明白,用書中的方式把 byte 轉換成 string 後再轉換回來好像會造成資料遺漏,偶試了一下,轉換前的位元組數比轉換後的位元組數小,ascii 碼方式位元組數不變,但資料與原始資料不符:

using System
using System.Collections.Generic

using System.Text

using System.Security.Cryptography


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] ibyte = new byte[1024]

            RandomNumberGenerator.Create().GetBytes(ibyte)

            string ascii2str = Encoding.ASCII.GetString(ibyte)

            string unicode2str = Encoding.Unicode.GetString(ibyte)

            string utf82str = Encoding.UTF8.GetString(ibyte)

            byte[] ascii2byte = Encoding.ASCII.GetBytes(ascii2str)

            byte[] unicode2byte = Encoding.Unicode.GetBytes(unicode2str)

            byte[] utf82byte = Encoding.UTF8.GetBytes(utf82str)

            Console.WriteLine(ascii2byte.Length+" "+unicode2byte.Length+" "+

utf82byte.Length)
            Console.ReadLine()

        }
    }
}

是不是用 Convert.ToByte("aa",16)Convert.ToString(SourceByte[i],16)或者一串Convert.FromBase64String()Convert.ToBase64String() 更好一點?偶是初學者,懇請作者批評指正。 

回答: 

親愛的讀者您好 

很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下 

免費閱讀中所提到如何將一個字串轉換成位元組陣列如何將一個位元組陣列轉換成一個字串兩者使用的時機視資料內容而定,您必須根據不同的資料內容來套用不同的編碼或是解碼函式,以便取得對應的位元組或是字串資料。 

程式範例 

本程式範例將建立四種不同的位元組資料,並使用三種不同的編碼方式將原本的位元組資料轉換為字串,觀察編碼函式處理後所產生之結果,程式碼如下所示: 

static void Main(string[] args)
{
 byte[] ibyte1, ibyte2, ibyte4;
 byte[] ibyte3 = new byte[1024];
 
 ibyte1 = System.Text.Encoding.ASCII.GetBytes("0123456789");
 ibyte2 = System.Text.Encoding.ASCII.GetBytes("
章立民");
 RandomNumberGenerator.Create().GetBytes(ibyte3);
 ibyte4 = new byte[]{0,1,2,3,4};

 Show(ibyte1);
 Show(ibyte2);
 Show(ibyte3);
 Show(ibyte4);

 Console.ReadLine();
}

private static void Show(byte[] Ibyte)
{
 Console.WriteLine("/**********************************************/n");
 Console.WriteLine("Ibyte[0]:" + Ibyte[0].ToString() + "n");

 string ascii2str = Encoding.ASCII.GetString(Ibyte);
 
Console.WriteLine("ascii2str:" + ascii2str + "t");
 Console.WriteLine("ascii2str.Length:" + ascii2str.Length + "n");

 string unicode2str = Encoding.Unicode.GetString(Ibyte);
 Console.WriteLine("unicode2str:" + unicode2str + "t");
 Console.WriteLine("unicode2str.Length:" + unicode2str.Length + "n");

 string utf82str = Encoding.UTF8.GetString(Ibyte);
 Console.WriteLine("utf82str:" + utf82str + "t");
 Console.WriteLine("utf82str.Length:" + utf82str.Length + "n");

 byte[] ascii2byte = Encoding.ASCII.GetBytes(ascii2str);
 byte[] unicode2byte = Encoding.Unicode.GetBytes(unicode2str);
 byte[] utf82byte = Encoding.UTF8.GetBytes(utf82str);

 
Console.WriteLine(ascii2byte.Length + " " +
   unicode2byte.Length + " " + utf82byte.Length + "n");
 Console.WriteLine("/**********************************************/n");
}

執行完程式之後發現,ibyte1 變數以 ASCII 或是 UTF8 編碼後,產生的字串內容與長度皆與原來變數相同。ibyte2 變數以 ASCII 或是 UTF8 編碼後,雖然產生的字串資料長度與原來變數相同,但是資料內容與原來的變數不同。ibyte3 變數以ASCII編碼後,產生的字串資料長度與原來變數相同。 ibyte4 變數以 ASCII 或是 UTF8 編碼後,產生的字串資料長度與原來變數相同,但是資料內容與原來的變數不同。 

從以上的結果可以得知,將位元組轉換為字串之前,必須先針對資料內容,選擇適合的轉換函式,才能夠得到符合需求的結果。