使用Convert.FromBase64String时遇Base64字符数组长度无效异常求助
解决Convert.FromBase64String的“Invalid length for a base-64 char array”异常
以下是针对问题的具体排查和解决步骤:
清理Base64字符串中的非法字符
Base64仅允许A-Z、a-z、0-9、+、/、=这些字符,记事本保存时可能自动插入换行、空格或不可见字符,先过滤掉非允许字符:var cleanBase64 = new string(myString.Where(c => (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/' || c == '=').ToArray());正确修正Base64长度
补=只能在字符串末尾,确保长度为4的倍数:int mod = cleanBase64.Length % 4; if (mod != 0) { cleanBase64 += new string('=', 4 - mod); }规避记事本UTF-8 BOM问题
记事本默认保存UTF-8文件时会添加BOM(字节顺序标记),读取时会混入非法字符,读取文件时指定无BOM的UTF-8编码:string myString = File.ReadAllText("你的文件路径.txt", new UTF8Encoding(false));完整处理流程示例
结合上述步骤,配合ZipArchive处理的完整代码:string rawString = File.ReadAllText("zip-base64.txt", new UTF8Encoding(false)); // 清理非法字符 var cleanBase64 = new string(rawString.Where(c => (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/' || c == '=').ToArray()); // 修正长度 int mod = cleanBase64.Length % 4; if (mod != 0) { cleanBase64 += new string('=', 4 - mod); } // 解码并处理ZipArchive byte[] zipBytes = Convert.FromBase64String(cleanBase64); using (var ms = new MemoryStream(zipBytes)) using (var archive = new ZipArchive(ms, ZipArchiveMode.Read)) { foreach (var entry in archive.Entries) { using (var reader = new StreamReader(entry.Open())) { string content = reader.ReadToEnd(); // 这里添加你的业务处理逻辑 } } }额外排查点
- 验证原始Base64内容正确性:将清理后的Base64字符串解码为字节数组,保存为
.zip文件,手动打开确认Zip文件未损坏。 - 确认记事本保存编码:避免使用ANSI编码,保存时选择“UTF-8”选项。
- 验证原始Base64内容正确性:将清理后的Base64字符串解码为字节数组,保存为
内容的提问来源于stack exchange,提问作者user3738874
相关产品推荐
相关产品推荐

