必须先用Encoding.UTF8.GetBytes()将字符串转为字节数组,再调用Convert.ToBase64String()编码;解码需用Convert.FromBase64String()转回字节数组,再用相同编码(如Encoding.UTF8.GetString())还原字符串。

用 Convert.ToBase64String 编码字符串,但必须先转成字节数组
直接对 string 调用 Convert.ToBase64String 会编译失败——它只接受 byte[]。所以关键一步是选对编码方式把字符串转成字节。
- 绝大多数场景用
Encoding.UTF8.GetBytes("hello"),兼容性好、不会丢字符 - 如果和旧系统对接(比如某些 Java 或 .NET Framework 2.0 的遗留逻辑),可能得用
Encoding.ASCII,但中文会变成? - 别用
Encoding.Default,它依赖系统区域设置,部署到服务器容易出错
示例:
string original = "你好 world"; byte[] bytes = Encoding.UTF8.GetBytes(original); string encoded = Convert.ToBase64String(bytes); // 得到 "5L2g5aW9IHdvcmxk"
解码时用 Convert.FromBase64String 再转回字符串
解码不是简单“逆向操作”,Convert.FromBase64String 返回的仍是 byte[],还得靠 Encoding 实例还原成 string,且编码必须和编码时一致。
- 如果编码用的是
UTF8,解码也必须用Encoding.UTF8.GetString(...) - 传入非法 Base64 字符串(比如含空格、换行、长度不是 4 的倍数)会抛
FormatException - 常见错误:把前端 JS 的
btoa("中文")结果直接丢进 C# 解码——JS 的btoa基于 Latin-1,C# 得先按 Latin-1 解码字节再转 UTF8,不能直解
安全解码建议加 try-catch:
try {
byte[] decodedBytes = Convert.FromBase64String(encoded);
string result = Encoding.UTF8.GetString(decodedBytes);
} catch (FormatException) {
// 处理无效 Base64
}注意 Base64 不是加密,只是编码;敏感内容该加密还得加密
Base64 是可逆的纯编码,和“加密”完全无关。HTTP 请求里用它传 token、图片数据可以,但别用来“保护密码”或“隐藏密钥”。
- Base64 输出长度约是原文的 133%,大文件编码后体积明显增大
- URL 场景下,标准 Base64 的
+和/会被 URL 解析器误解,需用Convert.ToBase64String(bytes, Base64FormattingOptions.None)+ 手动替换(或改用WebEncoders.Base64UrlEncode) - .NET 5+ 推荐用
WebEncoders.Base64UrlEncode/Base64UrlDecode处理 Web 场景,自动处理 URL 安全字符
遇到 “Invalid length for a Base-64 char array” 错误怎么办
这是最常见的运行时错误,根本原因是输入字符串长度不是 4 的倍数,或含非法字符(如换行、空格、中文标点)。
- 检查来源:日志打印原始字符串,确认没混入
\r\n或前后空格——用input.Trim()预处理 - Base64 补齐规则是末尾加
=,但有些 API 返回时省略了,可手动补:若长度 % 4 == 2 → 补两个=;若 == 3 → 补一个= - 别信“前端说给的是标准 Base64”,实际可能是 Base64Url 变种(用
-_替代+/),此时应优先尝试WebEncoders.Base64UrlDecode
补长逻辑示例:
string padded = input.Trim();
int padChars = 4 - (padded.Length % 4);
if (padChars < 4) padded += new string('=', padChars);Base64 编解码看着简单,真正上线后出问题的,八成卡在编码/解码两端用的 Encoding 不一致,或者没处理好传输过程中的空白和 URL 转义。


















