首页 > 代码库 > 如何在String和Byte[]对象之间进行转换
如何在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位包含被编码字符的位。
下图展示了比特、字节、编码和字符串的关系。
根据定义,字节数组和字符串的转换必然涉及使用某种编码方法。不同的编码方式将导致不同的转换结果。在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类型提供了大部分常见的编码算法支持,用以进行字符串和字节数组之间的转换。