在C#开发中,文件和Base64字符串的互相转换是常见需求,Base64编码可以将二进制文件数据转换为可打印的字符串,适合在文本协议、JSON数据、配置文件等场景中存储或传输文件内容。转换的核心逻辑是先读取文件的二进制字节数组,再通过Base64编码转换为字符串,反向转换则是先对Base64字符串解码得到字节数组,再写入文件。

基础概念说明
Base64编码的原理是将3个8位字节转换为4个6位字节,再映射为64个可打印字符,转换后的字符串长度会比原始二进制数据长约三分之一。C#中提供了System.Convert类来处理Base64的编码和解码,同时配合System.IO命名空间下的文件操作类完成文件的读写。
文件转换为Base64字符串
实现步骤分为三步:首先读取文件的全部字节数组,然后使用Convert.ToBase64String方法将字节数组编码为Base64字符串,最后返回结果。以下是完整的实现代码:
using System;
using System.IO;
public class FileBase64Converter
{
/// <summary>
/// 将文件转换为Base64字符串
/// </summary>
/// <param name="filePath">文件的完整路径</param>
/// <returns>Base64编码的字符串</returns>
public static string FileToBase64(string filePath)
{
// 检查文件是否存在
if (!File.Exists(filePath))
{
throw new FileNotFoundException("指定的文件不存在", filePath);
}
// 读取文件所有字节
byte[] fileBytes = File.ReadAllBytes(filePath);
// 转换为Base64字符串
string base64String = Convert.ToBase64String(fileBytes);
return base64String;
}
}
Base64字符串转换为文件
反向转换的步骤是:先使用Convert.FromBase64String方法将Base64字符串解码为字节数组,然后将字节数组写入到指定的文件路径中。实现代码如下:
using System;
using System.IO;
public class FileBase64Converter
{
/// <summary>
/// 将Base64字符串转换为文件
/// </summary>
/// <param name="base64String">Base64编码的字符串</param>
/// <param name="savePath">文件保存的完整路径</param>
public static void Base64ToFile(string base64String, string savePath)
{
// 检查Base64字符串是否为空
if (string.IsNullOrEmpty(base64String))
{
throw new ArgumentException("Base64字符串不能为空");
}
// 解码得到字节数组
byte[] fileBytes = Convert.FromBase64String(base64String);
// 获取保存目录,如果不存在则创建
string directory = Path.GetDirectoryName(savePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// 写入文件
File.WriteAllBytes(savePath, fileBytes);
}
}
使用示例
以下是调用上述两个方法的示例,演示如何将图片文件转换为Base64,再还原为新的图片文件:
using System;
class Program
{
static void Main()
{
try
{
string originalFilePath = @"C:testimage.jpg";
string saveFilePath = @"C:testnew_image.jpg";
// 文件转Base64
string base64 = FileBase64Converter.FileToBase64(originalFilePath);
Console.WriteLine("文件转换为Base64完成,字符串长度:" + base64.Length);
// Base64转文件
FileBase64Converter.Base64ToFile(base64, saveFilePath);
Console.WriteLine("Base64转换为文件完成,保存路径:" + saveFilePath);
}
catch (Exception ex)
{
Console.WriteLine("操作失败:" + ex.Message);
}
}
}
注意事项
- 大文件转换时,
File.ReadAllBytes和File.WriteAllBytes会将整个文件加载到内存中,如果文件过大可能导致内存溢出,此时需要使用流式读取的方式分块处理。 - Base64字符串中不合法的字符会导致
Convert.FromBase64String抛出异常,调用前可以先校验字符串格式,或者添加异常处理逻辑。 - 转换后的Base64字符串不包含文件的扩展名、编码信息等元数据,如果需要完整还原文件,需要额外记录文件的格式信息。