NET面试题:如何在String和Byte[]对象之间进行转换
在数据的处理过程中,不可避免地将经常遇到字符串和字节数组转换的需求。这一类的面试题旨在考查应聘者对于字符、编码等基本概念的理解程度。
  所涉及的知识点
· 比特、字节和编码的基本概念
· 在字符串和字节数组间进行转换
  分析问题
字符串和字节数组之间的转换,事实上代表了现实世界信息和数字世界信息之间的转换,要理解其中的机制,需要先了解一下几个基本概念。
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位包含被编码字符的位。
图4.1展示了比特、字节、编码和字符串的关系。

图4.1  比特、字节、编码的图示
根据定义,字节数组和字符串的转换必然涉及使用某种编码方法。不同的编码方式将导致不同的转换结果。在C#中,使用System.Text.Encoding来管理常用的编码。代码4-3展示了如何在字节数组和字符串之间进行转换。
代码4-3  字符串和字节数组转换:StringByte.cs
namespace NET.MST. Fourth.StringByte
{
    class StringByte
    {
        static void Main(string[] args)
        {
            String s = "我是字符串,I am string";
            //字节数组转换到字符串
            //UTF8编码
            Byte[] utf8 = StringToByte(s, Encoding.UTF8);
            //GB2312编码
            Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312"));
            //UNICODE编码
            Byte[] unicode = StringToByte(s, Encoding.Unicode);
            Console.WriteLine(utf8.Length);
            Console.WriteLine(gb2312.Length);
            Console.WriteLine(unicode.Length);
            //转换回字符串
            Console.WriteLine(ByteToString(utf8, Encoding.UTF8));
            Console.WriteLine(ByteToString(gb2312, Encoding.GetEncoding("GB2312")));
            Console.WriteLine(ByteToString(unicode, Encoding.Unicode));
            Console.Read();
        }
        //把字符串转换为字节数组
        static Byte[] StringToByte(String s, Encoding encoding)
        {
            return encoding.GetBytes(s);
        }
        //把字节数组转换为字符串
        static String ByteToString(Byte[] b, Encoding encoding)
        {
            return encoding.GetString(b);
        }
    }
}
程序展示了如何利用三种常见的编码方式把字符串转换成字节数组,接着再转换回字符串。程序中间检查了字节数组的长度,读者可以看到利用不同的编码方式产生的字节数组是完全不同的。对于具体的编码定义,有兴趣的读者可以参考ISO和RFC的标准文档。下面是程序的执行结果:
27
22
34
我是字符串,I am string
我是字符串,I am string
我是字符串,I am string
  答案
字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行。System.Text.Encoding类型提供了大部分常见的编码算法支持,用以进行字符串和字节数组之间的转换
 

更多.net面试题,.net电子书,.net教学视频请参考"爱学网izixue"