.NET String和Byte[]对象之间如何转换?

在实际开发中,经常会对数据进行处理,不可避免地会遇到字符串和字节数组相互转换的需求。字符串和字节数组的转换,事实上是代表了现实世界信息和数字世界信息之间的转换,要了解其中的机制,需要先对比特、直接以及编码这三个概念有所了解。
(1)比特:bit是一个位,计算机内物理保存的最基本单元,一个bit就是一个二进制位;.
(2)字节:byte由8个bit构成,其值可以由一个0~255的整数表示;
(3)编码:编码是数字信息和现实信息的转换机制,一种编码通常就定义了一种字符集和转换的原则,常用的编码方式包括UTF8、GB2312、Unicode等。
下图直观地展示了比特、字节、编码和字符串的关系:
.NET String和Byte[]对象之间如何转换?

从上图可以看出,字节数组和字符串的转换必然涉及到某种编码方式,不同的编码方式由不同的转换结果。在C#中,可以使用System.Text.Encoding来管理常用的编码。

下面的代码展示了如何在字节数组和字符串之间进行转换(分别使用UTF8、GB2312以及Unicode三种编码方式):

public class Program
{
    public static void Main(string[] args)
    {
        string s = "我是字符串,I am a string!";
        // 字节数组 -> 字符串
        Byte[] utf8 = StringToByte(s, Encoding.UTF8);
        Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312"));
        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.ReadKey();
    }

    // 字符串 -> 字节数组
    static Byte[] StringToByte(string str, Encoding encoding)
    {
        if (string.IsNullOrEmpty(str))
        {
            return null;
        }
        return encoding.GetBytes(str);
    }

    // 字节数组 -> 字符串
    static string ByteToString(Byte[] bytes, Encoding encoding)
    {
        if (bytes == null || bytes.Length <= 0)
        {
            return string.Empty;
        }

        return encoding.GetString(bytes);
    }
}

上述代码的运行结果如下图所示:

.NET String和Byte[]对象之间如何转换?

我们也可以从上图中看出,不同的编码方式产生的字节数组的长度各不相同。