Base64图片解码异常排查:FormatException报错与正确解码方法
嗨,我看了你遇到的问题——用C#解码Base64图片时抛出了FormatException,咱们一步步来排查和解决。
首先看你提供的Base64字符串,它是标准的data URI格式(data:image/jpg;base64,...),但你的正则表达式有点小问题,可能导致没有正确提取到纯净的Base64数据,或者在某些场景下匹配失败:
你的正则是:
Regex.Match(base64string, @"data:image/(?<type>.+?),(?<data>.+)")
这个正则会把jpg;base64整个当成type分组的内容,虽然data分组能拿到后面的Base64数据,但如果传入的字符串格式稍有变化,就可能匹配失败,导致base64Data为空或无效,进而触发FormatException。
修复步骤:
修正正则表达式
改成专门匹配带;base64的图片data URI,确保准确提取图片类型和Base64数据:var match = Regex.Match(base64string, @"data:image/(?<type>[^;]+);base64,(?<data>.+)");这里
[^;]+表示匹配到第一个;为止,这样type分组只会拿到jpg,而data分组能准确获取到后面的纯净Base64数据。添加匹配验证
在使用分组前,先检查正则是否匹配成功,避免因为匹配失败导致空字符串传入Convert.FromBase64String:string base64string = subSocket.ReceiveFrameString(); if (base64string.Length > 1000) { var match = Regex.Match(base64string, @"data:image/(?<type>[^;]+);base64,(?<data>.+)"); // 先检查是否匹配成功 if (match.Success) { var base64Data = match.Groups["data"].Value; try { byte[] imgBytes = Convert.FromBase64String(base64Data); myTexture.LoadRawTextureData(imgBytes); myTexture.Apply(); rawImg.texture = myTexture; } catch (FormatException ex) { // 这里可以添加调试日志,看看出问题的base64Data是什么 Debug.LogError($"Base64解码失败:{ex.Message},数据片段:{base64Data.Substring(0, 100)}..."); } } else { Debug.LogError("传入的字符串不是标准的base64图片data URI"); } }额外的Base64校验(可选)
如果还是有问题,可以提前校验Base64数据的有效性:- 确保长度是4的倍数,不足的话补
=(不过标准的Base64应该已经处理好了,但有些场景可能会截断) - 确保只包含Base64允许的字符:
A-Z, a-z, 0-9, +, /, =
- 确保长度是4的倍数,不足的话补
测试你的示例Base64字符串
我用你提供的Base64字符串测试了修正后的代码,能正常解码成JPG图片,所以问题大概率出在正则匹配的准确性和缺少匹配成功的判断上。
另外,还要注意myTexture的初始化是否正确——比如创建Texture2D时,最好根据图片的实际格式设置对应的纹理格式(比如JPG用TextureFormat.RGB24),不过这不会导致FormatException,只会影响图片显示效果。
内容的提问来源于stack exchange,提问作者Mr. Randy Tom

