BASE64编码的作用及C#对其的支持?

和传统的编码不同,BASE64编码的设计致力于混淆那些8位字节的数据流(解决网络传输中的明码问题),在网络传输、邮件等系统中被广泛应用。需要明确的是:BASE64不属于加密机制,但它却是把明码变成了一种很难识别的形式。.

BASE64的算法如下:

BASE64把所有的位分开,并且重新组合成字节,新的字节只包含6位,最后在每个字节前添加两个0,组成了新的字节数组。例如:一个字节数组只包含三个字节(每个字节又有8位比特),对其进行BASE64编码时会将其分配到4个新的字节中(为什么是4个呢?计算3*8/6=4),其中每个字节只填充低6位,最后把高2位置为零。

下图清晰地展示了上面所讲到的BASE64的算法示例:

BASE64编码的作用及C#对其的支持?

在.NET中,BASE64编码的应用也很多,例如在ASP.NET WebForm中,默认为我们生成了一个ViewState来保持状态,如下图所示:

BASE64编码的作用及C#对其的支持?

这里的ViewState其实就是服务器在返回给浏览器前进行了一次BASE64编码,我们可以通过一些解码工具进行反BASE64编码查看其中的奥秘:

BASE64编码的作用及C#对其的支持?

那么,问题来了?在.NET中开发中,怎样来进行BASE64的编码和解码呢,.NET基类库中提供了一个Convert类,其中有两个静态方法提供了BASE64的编码和解码,但要注意的是:Convert类型在转换失败时会直接抛出异常,我们需要在开发中注意对潜在异常的处理(比如使用is或as来进行高效的类型转换)。下面的代码展示了其用法:

public class Program
{
    public static void Main(string[] args)
    {
        string test = "abcde ";
        // 生成UTF8字节数组
        byte[] bytes = Encoding.UTF8.GetBytes(test);
        // 转换成Base64字符串
        string base64 = BytesToBase64(bytes);
        Console.WriteLine(base64);
        // 转换回UTF8字节数组
        bytes = Base64ToBytes(base64);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));

        Console.ReadKey();
    }

    // Bytes to Base64
    static string BytesToBase64(byte[] bytes)
    {
        try
        {
            return Convert.ToBase64String(bytes);
        }
        catch
        {
            return null;
        }
    }

    // Base64 to Bytes
    static Byte[] Base64ToBytes(string base64)
    {
        try
        {
            return Convert.FromBase64String(base64);
        }
        catch
        {
            return null;
        }
    }
}

上面代码的执行结果如下图所示:

BASE64编码的作用及C#对其的支持?