视频图像处理系列索引 || Arcgis/Engine/Server开发索引 || Web Map Gis开发索引 || jquery表格组件 JQGrid索引
WPF MVVM模式开发实现简明教程索引 || ArcGIS Runtime WPF(.net C#)开发简明教程索引

C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决

最近用base64编码传图片遇到了点问题,总结下。

 

首先总结下base64编码的逻辑,来自网络:https://www.cnblogs.com/zhangchengye/p/5432276.html

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节

数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前

补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是

3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在

结尾添加1到2个 “=”。

例:将对ABC进行BASE64编码:


1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
 3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、 再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100

)(00001001)(00000011),其中蓝色部分为真实数据;
 5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
 6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是

数据在字符表中的索引。

注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

 

Image或bitmap与base64互转的办法:(网上很多了,仅供参考)

public static Bitmap GetImageFromBase64(string base64string)
        {
            byte[] b = Convert.FromBase64String(base64string);
            MemoryStream ms = new MemoryStream(b);
            Bitmap bitmap = new Bitmap(ms);
            return bitmap;
        }

        public static string GetBase64FromImage(Image imagefile)
        {
            try
            {
                //Bitmap bmp = new Bitmap(imagefile);

                //MemoryStream ms = new MemoryStream();
                //bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

                //byte[] arr = new byte[ms.Length];
                //ms.Position = 0;
                //// ms.Seek(0, SeekOrigin.Begin);
                //ms.Read(arr, 0, (int)ms.Length);
                //ms.Close();
                //return Convert.ToBase64String(arr);
                using (MemoryStream ms = new MemoryStream())
                {  
                    imagefile.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                    ms.Seek(0, SeekOrigin.Begin);
                    // byte[] arr = ms.GetBuffer(); 
                    byte[] arr = ms.ToArray();

                    return Convert.ToBase64String(arr);
                }
            }
            catch (Exception)
            {
                return "";
            }
        }

  

下面说说遇到的问题:

Convert.FromBase64String(base64string);时偶尔报错

“System.FormatException”类型的未经处理的异常在 mscorlib.dll 中发生

其他信息: Base-64 字符数组或字符串的长度无效。

 

众所周知这种转换超级简单,实在想象不出是什么原因。

 

由上面的编码方式可知,base64编码后长度必须是4的倍数,不足则用=补齐

而根据对方接收的,确实不是4的倍数,而我这边记录的是4的倍数。

 

后来查看解析方代码知道原因了:

他收到xml后先替换utf8成GBK,这样如果正好base64字符串里含有utf8就会被替换,替换后就不是4的倍数就报错了。

strXml = strXml.Replace("UTF-8", "GBK").Replace("utf8", "GBK");

 

很简单的错误,查了很久。

 

这类错误,一般查询是否什么特殊字符被替换就行了,比如url传参之类的。不要考虑转换过程可能有问题,基本不存在的。

 

posted @ 2018-05-07 11:13  jhlong  阅读(1702)  评论(0编辑  收藏  举报
海龙的博客 jhlong@cnblogs 版权所有© 转载请注明链接.有用请推荐一下
代码全部经过本人测试,但不保证复制粘贴就正常运行,更不保证能解决你的问题,请结合前后代码及描述理解后修改和使用