转载:http://www.cnblogs.com/jzywh/archive/2008/04/20/base64_encode_large_file.html

The class System.Convert provide two basic methods "ToBase64String()" and "Convert.FromBase64String()" to encode a byte array to a base64 string and decode a base64 string to a byte array.

public string Encode(byte[] data)
{
    return Convert.ToBase64String(data);
}
        
public byte[] Decode(string strBase64)
{
    return Convert.FromBase64String(strBase64);
}

It is very good to use them to encode and decode base64. But in some case, it is a disaster.

For example, if you want to encode a 4 gb file to base64, the code above must throw an OutOfMemory exception., because you must read the file into a byte array. So we need to look for another way to encode and decode by base64.

Long days ago, a man have posted an article about how to deal with it.

http://blogs.microsoft.co.il/blogs/kim/archive/2007/10/09/base64-encode-large-files-very-large-files.aspx

This man use XmlWriter to work around it.

By researching the basis of the Base64 encoding in rfc, I found another more directly way to deal with it.

According rfc3548, base64 encode data in the unit of 3 bytes to 4 bytes, if the last part's length is less than 3,
the char '=' will be padded. So we can encode file in small chunks whose size is 3, then we can get the encoding data of the file by combiling encoding data of every chunks.

So I have below code:

public void EncodeFile(string inputFile, string outputFile)
{
       using(FileStream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
          {
                using(StreamWriter outputWriter = new StreamWriter(outputFile, false, Encoding.ASCII))
              {
                  byte[] data = new byte[3 * 1024]; //Chunk size is 3k
                  int read    = inputStream.Read(data, 0, data.Length);
                  
               while(read > 0)
                    {
                      outputWriter.Write(Convert.ToBase64String(data, 0, read));
                      read = inputStream.Read(data, 0, data.Length);
                  }
                  
                  outputWriter.Close();                    
              }
              
              inputStream.Close();
          }
      }

    public void DecodeFile(string inputFile, string outputFile)
        {
          using (FileStream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
              using (FileStream outputStream = File.Create(outputFile))
                {
                  byte[] data = new byte[4 * 1024]; //Chunk size is 4k
                  int read = inputStream.Read(data, 0, data.Length);

                  byte[] chunk    = new byte[3 * 1024];
          
                  while (read > 0)
                   {
                      chunk = Convert.FromBase64String(Encoding.ASCII.GetString(data, 0, read));
                      outputStream.Write(chunk, 0, chunk.Length);
                      read = inputStream.Read(data, 0, data.Length);
                  }

                  outputStream.Close();
              }

              inputStream.Close();
          }
      }

The methods also can be improved to support mime format (76 chars per line).

public static void EncodeFile(string inputFile, string outputFile)
       {
         using(FileStream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
           {
              using(StreamWriter outputWriter = new StreamWriter(outputFile, false, Encoding.ASCII))                {
                  byte[] data = new byte[57 * 1024]; //Chunk size is 57k
                  int read    = inputStream.Read(data, 0, data.Length);
                  
                 while(read > 0)
                   {
                      outputWriter.WriteLine(Convert.ToBase64String(data, 0, read, Base64FormattingOptions.InsertLineBreaks));
                      read = inputStream.Read(data, 0, data.Length);
                  }
                  
                  outputWriter.Close();                    
              }
              
              inputStream.Close();
          }
      }

      public static void DecodeFile(string inputFile, string outputFile)
       {
      using (StreamReader reader = new StreamReader(inputFile, Encoding.ASCII, true))
           {
          using (FileStream outputStream = File.Create(outputFile))
               {                
              string line = reader.ReadLine();

              while (!string.IsNullOrEmpty(line))
                   {
                  if (line.Length > 76)
                      throw new InvalidDataException("Invalid mime-format base64 file");

                  byte[] chunk = Convert.FromBase64String(line);
                  outputStream.Write(chunk, 0, chunk.Length);
                  line = reader.ReadLine();
              }

              outputStream.Close();
          }

          reader.Close();
      }
  }

 

Base64 encode/decode large file的更多相关文章

  1. node_nibbler:自定义Base32/base64 encode/decode库

    https://github.com/mattrobenolt/node_nibbler 可以将本源码复制到自己需要的JS文件中,比如下面这个文件,一个基于BASE64加密请求参数的REST工具: [ ...

  2. javascript base64 encode decode 支持中文

    * 字符编码 ** 一定要知道数据的字符编码 ** 使用utf-8字符编码存储数据 ** 使用utf-8字符编码输出数据 * Crypto.js 支持中文 Base64编码说明 Base64编码要求把 ...

  3. BASE64 Encode Decode

    package com.humi.encryption; import java.io.IOException; import java.io.UnsupportedEncodingException ...

  4. python encode decode unicode区别及用法

    decode 解码 encode 转码 unicode是一种编码,具体可以百度搜 # coding: UTF-8 u = u'汉' print repr(u) # u'\u6c49' s = u.en ...

  5. java URLEncoder 和Base64.encode()

    参考: http://www.360doc.com/content/10/1103/12/1485725_66213001.shtml (URLEncode) http://blog.csdn.net ...

  6. python编码问题之\"encode\"&\"decode\"

    python encode decode 编码 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换 ...

  7. python编码encode decode(解惑)

    关于python 字符串编码一直没有搞清楚,今天总结了一下. Python 字符串类型 Python有两种字符串类型:str 与 unicode. 字符串实例 # -*- coding: utf-8 ...

  8. (转)Integrating Intel® Media SDK with FFmpeg for mux/demuxing and audio encode/decode usages 1

    Download Article and Source Code Download Integrating Intel® Media SDK with FFmpeg for mux/demuxing ...

  9. python3.3 unicode(encode&decode)

    最近在用python写多语言的一个插件时,涉及到python3.x中的unicode和编码操作,本文就是针对编码问题研究的汇总,目前已开源至github.以下内容来自项目中的README. 1 ASC ...

随机推荐

  1. 理解SVG坐标系统和变换: transform属性

    SVG元素可以通过缩放,移动,倾斜和旋转来变换-类似HTML元素使用CSS transform来变换.然而,当涉及到坐标系时这些变换所产生的影响必然有一定差别.在这篇文章中我们讨论SVG的transf ...

  2. Nginx、SSL双向认证、PHP、SOAP、Webservice、https

    本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是 ...

  3. selenium2.0的初步封装(java版本)

    我们都知道, 在本地创建java项目后,引入selenium-java-2.35.0.jar   selenium-support-2.35.0.jar junit-4.8.1.jar等等jar包之后 ...

  4. 关于FP-Growth 算法一个很好的ppt-学习分享

    http://pan.baidu.com/share/link?shareid=1980963149&uk=1594824745

  5. YUV格式总结

    1. YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间.在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取 ...

  6. 组件局域网中的无集线器、Windows XP、Windows 7、Windows 8的对等网

     为什么要用对等网? 答:对等网采用分散管理的方式,网络中的每台计算机既作为客户机又可作为服务器来工作,每个用户都管理自己机器上的资源. 组建局域网中无集线器的对等网 组建局域网中Windows XP ...

  7. hdoj 1532 Drainage Ditches【最大流模板题】

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. iptables与tcpdump谁更靠近网卡

    结论是tcpdump,用tcpdump抓包试试就知道了. // 将所有访问8080端口的包丢弃 iptables -A INPUT -s -j DROP // 查看iptables的策略 iptabl ...

  9. Asp.net Mvc 自定义Session (一),

    大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群. 这系列博客主要讲解  怎样 解决用户过多的session自动消亡,和分 ...

  10. opencl 在vs2015上遇见的问题

    严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'clCreateCommandQueue': 被声明为已否决 Project2 d:... 解决方法:#pragma warnin ...