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"