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 ...
随机推荐
- web.xml配置详解之欢迎页面和错误页面
<!-- 应用的欢迎页面 采用list的方式罗列欢迎页面, 系统会从第一个找到最后一个,找到了文件就不继续往下找了.优先显示前边的. --> <welcome-file-list& ...
- Java问题汇集(2)
1.Error setting driver on UnpooledDataSource 具体:Exception in thread "main" org.apache.ibat ...
- 读《CSS禅意花园》 有感
1.图片用<img>标签添加到页面中,会增加页面的大小,导致页面加载需要更长的时间.可以用css background 引用图片. 1.1.若图像属于“内容”而不是“样式”的一部分,例如“ ...
- 在windows下创建基于github的hexo静态博客
最近边上的人都突然买起了域名搭起了个人网站,渣渣的我介于期末没事干也跟风搭了个静态博客.虽说博客基本不更新T T,嘛嘛回归正题. 首先准备工作: 1)安装nodejs 2)安装msysgit(虽然现在 ...
- 【原】Spark中Job如何划分为Stage
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job的提交 http://www.cnblogs.com/yourarebest/p/5342404.html 1.Spark中 ...
- cloudstack安装篇2-主机名配置
CloudStack要求正确配置主机名.在默认情况下,安装完操作系统后,主机名是localhost.localdomain.运行下面的命令来测试: hostname --fqdn 在此处将返回这样的结 ...
- POJ-3678 Katu Puzzle 2sat
题目链接:http://poj.org/problem?id=3678 分别对and,or,xor推出相对应的逻辑关系: 逻辑关系 1 0 A and B A'->A,B'->B ...
- PHP中的生成XML文件的4种方法(转)
<?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...
- PC-启动慢的解决好方法!
你试试这样看行不行: 首先,打开“系统属性”(在我的电脑上点右键-属性,或者在控制面板里打开“系统”,快捷键win+pause break)点“高级”选项卡,在“启动和故障恢复”区里打开“设置”,去 ...
- android httpClient 支持HTTPS的2种处理方式
摘自: http://www.kankanews.com/ICkengine/archives/9634.shtml 项目中Android https或http请求地址重定向为HTTPS的地址,相信很 ...