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 编码后,产生的字符串数据长度与原来变量相同,但是数据内容与原来的变量不同。 

 

从以上的结果可以得知,将字节转换为字符串之前,必须先针对数据内容,选择适合的转换函式,才能够得到符合需求的结果。

 

注:该问题的原链接在此处
http://www.china-pub.com/static/jsj_zlm_060824.html

posted on 2006-10-19 10:33  章立民研究室  阅读(1335)  评论(2编辑  收藏  举报

导航