Base64 encode/decode large file
转载: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.
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的更多相关文章
- node_nibbler:自定义Base32/base64 encode/decode库
		
https://github.com/mattrobenolt/node_nibbler 可以将本源码复制到自己需要的JS文件中,比如下面这个文件,一个基于BASE64加密请求参数的REST工具: [ ...
 - javascript base64 encode decode 支持中文
		
* 字符编码 ** 一定要知道数据的字符编码 ** 使用utf-8字符编码存储数据 ** 使用utf-8字符编码输出数据 * Crypto.js 支持中文 Base64编码说明 Base64编码要求把 ...
 - BASE64  Encode Decode
		
package com.humi.encryption; import java.io.IOException; import java.io.UnsupportedEncodingException ...
 - python encode decode unicode区别及用法
		
decode 解码 encode 转码 unicode是一种编码,具体可以百度搜 # coding: UTF-8 u = u'汉' print repr(u) # u'\u6c49' s = u.en ...
 - java URLEncoder 和Base64.encode()
		
参考: http://www.360doc.com/content/10/1103/12/1485725_66213001.shtml (URLEncode) http://blog.csdn.net ...
 - python编码问题之\"encode\"&\"decode\"
		
python encode decode 编码 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换 ...
 - python编码encode decode(解惑)
		
关于python 字符串编码一直没有搞清楚,今天总结了一下. Python 字符串类型 Python有两种字符串类型:str 与 unicode. 字符串实例 # -*- coding: utf-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 ...
 - python3.3 unicode(encode&decode)
		
最近在用python写多语言的一个插件时,涉及到python3.x中的unicode和编码操作,本文就是针对编码问题研究的汇总,目前已开源至github.以下内容来自项目中的README. 1 ASC ...
 
随机推荐
- C# #if DEBUG
			
首先,大小写不能写错,其次,解决方案配置设为:Debug,才会执行该语句,如果在条件里面搭配Debug.Assert等,效果甚佳.而如果要设置为Release模式,就不会执行条件语句中的内容,有时候可 ...
 - LVS与其他负载均衡软件的区别
			
有人在邮件列表问haproxy的作者为何haproxy无论是tcp模式还是http模式,能支撑的并发量都不是太大. Willy回答了这个问题. Exactly. The difference is ...
 - Nginx实现七层负载均衡配置指导
			
本文描述了如何使用Nginx实现在应用层实现7层负载均衡功能,Nginx支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查功能.废话不多说,详细 ...
 - Windows下搭建Nginx实现负载均衡
			
环境:本次测试,使用两台电脑,分别是 192.168.0.1,192.168.0.2. 其中Nginx也部署在 192.168.0.1 电脑上,所以 PC1 的IIS端口不能使用80,因为Nginx需 ...
 - insertion Sort List  (链表的插入排序) leecode   java
			
逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...
 - Android ListView 全面优化
			
结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListVie ...
 - 关于int **
			
例子1: int foo(int *array) { array = (); ; } //外头调用 int * uidArray = NULL; foo(uidArray): 这时候我想要在函数里给数 ...
 - Kafka系列(一)安装和配置说明
			
单机模式 修改kafak安装文件中 .../kafka_2.9.2-0.8.1.1/config 下面的server.properties 配置文件 1.broker.id=0 [默认不用修改,该 ...
 - Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013  http://www.microsoft.com/en-us/download/details.aspx?id=42313
			
Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 http://www.microsoft. ...
 - c语言 函数返回二位数组 函数参数为二维数组
			
通过typedef可以简单实现.也可以直接写. 写了两个简单的矩阵操作的函数简单示例. #include <stdio.h> #include <stdlib.h> const ...