Base64的编解码方法
64位字符串的编码解码[转]
![64位字符串的编码解码[转]](https://img.taocdn.com/s3/m/e44ed65668eae009581b6bd97f1922791688be05.png)
64位字符串的编码解码[转]⼀. Base64的编码规则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+/⼆.解码规则解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
三. C#中的实现编码:byte[] bytes = Encoding.Default.GetBytes("要转换的字符"); string str = Convert.ToBase64String(bytes);解码:byte[] outputb = Convert.FromBase64String(str); string orgStr = Encoding.Default.GetString(outputb);C#图⽚的Base64编码和解码图⽚的Base64编码:System.IO.MemoryStream m = new System.IO.MemoryStream();System.Drawing.Bitmap bp = new System.Drawing.Bitmap(@“c:\demo.GIF”);bp.Save(m, System.Drawing.Imaging.ImageFormat.Gif);byte[]b= m.GetBuffer();string base64string=Convert.ToBase64String(b);Base64字符串解码:byte[] bt = Convert.FromBase64String(base64string);System.IO.MemoryStream stream = new System.IO.MemoryStream(bt);Bitmap bitmap = new Bitmap(stream);pictureBox1.Image = bitmap;。
base16,32,64base编码和解码方法

base16,32,64base编码和解码⽅法base16,32,64 base编码和解码⽅法在⽹络传⼊字符串过程中,如果编码⽅式是基于ASCII,那么会造成什么问题?⽐如:url地址中存在"/"(如:/nav/ai),字符串中编码中也存在"/",这样就会出现错误地址解析.为了防⽌这种情况的出现,出现了Base16,Base32,Base64编码⽅式.我们知道计算机传输的单位是字节,也就是8个⽐特位,按照⼀个字节编码的⽅式结果就有256种状态(每个⽐特位0或者1两种状态,8位就是=256),ASCII编码是将8个⽐特位中最⾼位置为0,所以总共可表⽰128个字符(即=128).为了避免冲突,去掉⼀些特殊字符,重新编码.例如Base16编码,编码后的字符只会在(09,A F)中,Base32编码后字符就会在(A~Z, 2~7)中以及填充符"="中出现.Base16编码是包含了数字(09)和⼤写字母(A F),Base32编码与Base64编码最⼤区别是前者没有⼩写字母.Base32编码可以⽤于⽂件系统的名称(不区分⼤⼩情况).⽽Base64编码后数据量相⽐原先不是增加很多,可以⽤于⽹络传输.(⽐如下载链接)base64Base64是⽹络上最常见的⽤于传输8Bit字节码的编码⽅式之⼀,Base64就是⼀种基于64个可打印字符来表⽰⼆进制数据的⽅法。
可查看RFC2045~RFC2049,上⾯有MIME的详细规范。
Base64编码是从⼆进制到字符的过程,可⽤于在HTTP环境下传递较长的标识信息。
采⽤Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被⼴泛应⽤于计算机的各个领域,然⽽由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应⽤场景⼜分别研制了Base64的各种“变种”。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位⾼位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要⽐原来的长1/3。
Base64位编码解码

Base64编码说明Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。
编码表的大小为2^6=64,这也是Base64名称的由来。
Base64编码表码值字符码值字符码值字符码值字符0 A 16 Q 32 g 48 w1 B 17 R 33 h 49 x2 C 18 S 34 i 50 y3 D 19 T 35 j 51 z4 E 20 U 36 k 52 05 F 21 V 37 l 53 16 G 22 W 38 m 54 27 H 23 X 39 n 55 38 I 24 Y 40 o 56 49 J 25 Z 41 p 57 510 K 26 a 42 q 58 611 L 27 b 43 r 59 712 M 28 c 44 s 60 813 N 29 d 45 t 61 914 O 30 e 46 u 62 +15 P 31 f 47 v 63 /原理转码过程例子:3*8=4*6内存1个字符占8位转前: s 1 3先转成ascii:对应 115 49 512进制: 01110011 00110001 001100116个一组(4组)011100110011000100110011然后才有后面的 011100 110011 000100 110011然后计算机是8位8位的存数 6不够,自动就补两个高位0了所有有了高位补0科学计算器输入00011100 00110011 00000100 00110011得到 28 51 4 51查对下照表 c z E z。
Base64的编码(Encode)与解码(Decode),及记录JDK10下部分使用new。。。

Base64的编码(Encode)与解码(Decode),及记录JDK10下部分使⽤new。
本⽂记录Base64的编码(Encode)与解码(Decode),及记录JDK10下部分使⽤ new BASE64Decoder().encode(byte[] bytes)⽅法报错。
⽬前有三种⽅式进⾏base64的编解码。
1.说明: 在Java⽤Base64⼀点都不难,不⽤⼏⾏程式码就解决了!只是这个sun.misc套件所提供的Base64功能,编码和解码的效率并不太好--->2.(1)在java早期使⽤JDK⾥sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类别,主要代码如下3.final BASE64Encoder encoder = new BASE64Encoder();4.final BASE64Decoder decoder = new BASE64Decoder();5.final String text = "字串⽂字";6.final byte[] textByte = text.getBytes("UTF-8");7.//编码8.final String encodedText = encoder.encode(textByte);9.System.out.println(encodedText);10.//解码11.System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));1.(2)appache--Apache Commons Codec有提供Base64的编码与解码功能,会使⽤到mons.codec.binary套件下的Base64类别,使⽤⽅法如下:2.final Base64 base64 = new Base64();3.final String text = "字串⽂字";4.final byte[] textByte = text.getBytes("UTF-8");5.//编码6.final String encodedText = base64.encodeToString(textByte);7.System.out.println(encodedText);8.//解码9.System.out.println(new String(base64.decode(encodedText), "UTF-8"));10.使⽤⽅法⽆区别,就是包和sun.misc套件包名有区别,效能实际执⾏起来也快了不少。
OpenSSLBase64编码和解码

OpenSS L Base64编码和解码一、编码解码、函数介绍:编码函数:EVP_En codeI nit函数原型:void EVP_En codeI nit(EVP_EN CODE_CTX *ctx);功能:该函数初始化一个用来进行base64编码的结构,事实上,该函数只是简单设置了结构里面几个常量的长度。
参数:ctx:base64设备上下文。
EVP_En codeU pdate函数原型:void EVP_En codeU pdate(EVP_EN CODE_CTX *ctx,unsign ed char *out,int *outl,unsign ed char *in,int inl);功能:该函数将参数i n里面的i nl自己数据拷贝到结构体ct x里面,如果结构体里面有数据,就同时将结构体里面的数据进行BASE64编码并输出到参数out指向的缓存里面,输出数据的长度保存在o u tl里面。
注意,在第一次调用本函数的时候,虽然往结构体里面拷贝数据了,但是结构体c t x里面开始是没有输入数据存在并且输入数据长度不超出ctx内部存储数据的最长限制,就不会有任何数据被进行BASE64编码,也就是说,不会有任何数据输出;但是如果输入数据长度比内部存储的数据长,那么就会输出部分经过B ASE64编码的数据。
数据输出总是在下一层输入前完成的。
参数:ctx:base64设备上下文。
out:存放编码后的数据缓冲区。
outl:编码后的数据长度。
in:编码前的数据。
inl:编码前的数据长度。
EVP_En codeF inal函数原型:void EVP_En codeF inal(EVP_EN CODE_CTX *ctx,unsign ed char *out,int *outl);功能:该函数将结构体ctx里面剩余数据进行BAS E64编码并写入到参数out里面去,输出数据的长度保存在o u tl里面。
Mac命令行快速编码和解码专家技巧

Mac命令行快速编码和解码专家技巧在Mac操作系统中,命令行是一种强大的工具,可以用来执行各种任务和操作。
除了常见的命令行操作,Mac还提供了一些快速编码和解码的专家技巧,让您更高效地处理和转换文件以满足您的需求。
本文将为您介绍一些Mac命令行下的快速编码和解码技巧,并且提供适用的格式来书写。
一、Base64编码和解码Base64是一种常用的编码格式,可以将二进制数据转换成可打印的ASCII字符。
在Mac命令行下,您可以使用以下命令来进行Base64编码和解码:1. 编码文件:```base64 inputfile > outputfile```在这个命令中,将inputfile文件进行Base64编码,并将输出结果保存到outputfile文件中。
2. 编码字符串:```echo "string" | base64```这个命令将字符串“string”进行Base64编码,并将结果直接打印在命令行中。
3. 解码文件:```base64 -D inputfile > outputfile```该命令将Base64编码的inputfile文件解码,并将结果保存到outputfile文件中。
4. 解码字符串:```echo "encodedstring" | base64 -D```该命令将Base64编码的字符串“encodedstring”解码,并将结果直接打印在命令行中。
二、URL编码和解码在进行网络请求或处理URL时,经常需要对特殊字符进行编码。
Mac命令行提供了URL编码和解码的功能,用于处理URL中的特殊字符。
以下是相关的命令:1. 编码URL:echo -n "url" | xxd -plain | sed 's/\(..\)/%\1/g'```该命令将URL进行URL编码,并将结果直接打印在命令行中。
Java实现Base64编解码

Java实现Base64编解码为什么要⽤Base64编码在⽹络中传输数据都是使⽤ascii⽅式传输。
对于⼀些图⽚、视频等数据,可能就会被编码成ascii中不可见部分的编码。
⽹络中不同的路由设备处理⽅式不同,有可能就会把这部分数据弄丢了。
为了保证数据传输的正确性,可以使⽤Base64编码将这些不可见数据编码成可见数据。
Java实现Base64编解码的⼏种⽅法⽅法⼀使⽤sun.misc包中的BASE64Encoder和BASE64Decoder类进⾏编解码。
这种⽅式⽐较古⽼,不推荐使⽤。
代码如下:/*** sun.misc⽅式Base64编码* @param str* @return*/public static String encodeBySunMisc(String str) {try {return new BASE64Encoder().encode(str.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();return "";}}/*** sun.misc⽅式Base64解码* @param str* @return*/public static String decodeBySunMisc(String str) {try {byte[] result = new BASE64Decoder().decodeBuffer(str);return new String(result);} catch (IOException e) {e.printStackTrace();return "";}}sun.misc的Base64⼯具虽然在jdk中,但是并不属于标准库,所以在Eclipse中⽆法直接使⽤。
可以通过⼿动引⼊⽅式使⽤。
Base64算法原理,以及编码、解码【加密、解密】介绍

Base64算法原理,以及编码、解码【加密、解密】介绍Base64编码,是我们程序开发中经常使⽤到的编码⽅法。
它是⼀种基于⽤64个可打印字符来表⽰⼆进制数据的表⽰⽅法。
它通常⽤作存储、传输⼀些⼆进制数据编码⽅法!也是MIME(多⽤途互联⽹邮件扩展,主要⽤作电⼦邮件标准)中⼀种可打印字符表⽰⼆进制数据的常见编码⽅法!它其实只是定义⽤可打印字符传输内容⼀种⽅法,并不会产⽣新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合⾃⼰的实际需要,构造⼀些⾃⼰接⼝定义编码⽅式。
好了,我们⼀起看看,它的转换思路吧!Base64实现转换原理它是⽤64个可打印字符表⽰⼆进制所有数据⽅法。
由于2的6次⽅等于64,所以可以⽤每6个位元为⼀个单元,对应某个可打印字符。
我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要⽤4个Base64的可打印字符来表⽰。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中⼀般有所不同。
但是,我们经常所说的Base64另外2个字符是:“+/”。
这64个字符,所对应表如下。
转换的时候,将三个byte的数据,先后放⼊⼀个24bit的缓冲区中,先来的byte占⾼位。
数据不⾜3byte的话,于缓冲区中剩下的bit⽤0补⾜。
然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。
不断进⾏,直到全部输⼊数据转换完成。
如果最后剩下两个输⼊数据,在编码结果后加1个“=”;如果最后剩下⼀个输⼊数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
编码后的数据⽐原始数据略长,为原来的4/3。
⽆论什么样的字符都会全部被编码,因此不像编码,还保留部分可打印字符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for (i=0; i < iSrcLen; i++)
{
if (pInput[i] > 127) continue;
if (pInput[i] == '=') return p-pOutput+1;
BYTE a = BVal(pInput[i]);
if (a == 255) continue;
#define AVal(x) Base64ValTab[x]
int CSeeBase64Dlg::EncodeBase64(char * pInput, char * pOutput)
{
int i = 0;
int loop = 0;
int remain = 0;
int iDstLen = 0;
int iSrcLen = (int)strlen(pInput);
由此可见Base64后的字符串,长度一定是4的整数倍,末尾有一个,两个或没有'='。
要注意的是为了兼容有些邮件服务器,Base64后的字符串经常要插入来确保每一行不超过76个字符,解析时要跳过它们。
好了,原理就是这样的,是不是很简单,就是取3个转成4个,好了,上代码:
首先是编码:
const BYTE Base64ValTab[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
loop = iSrcLen/3;
remain = iSrcLen%3;
// also can encode native char one by one as decode method
// but because all of char in native string is to be encoded so encode 3-chars one time is easier.
15,16,17,18, 19,20,21,22, 23,24,25,255, 255,255,255,255,
255,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,255, 255,255,255,255
pOutput[iDstLen++] = AVal(a2);
pOutput[iDstLen++] = AVal(a3);
pOutput[iDstLen++] = '=';
pOutput[iDstLen] = 0x00;
}
else
{
// just division by 3
pOutput[iDstLen] = 0x00;
所有的字符就是'A'~'Z','a'~'z','0'~'9','+','/'共64个,以及末尾的填充字符'='
编码的方法是:
从输入缓冲中依次取出字符,第一个字符的,从最高位开始取出6个bit,这6个bit的值的范围在0~63,将这个值作为索引,对应上面的表格,找到相应的字符,这便是第一个Base64后的字符,然后将第一个字符的低2位与第二个字符的高4位组成6个bit,同样查表得到第二个Base64字符,以此类推,从左向右没凑足6个bit就转换成一个Base64字符,由于输入缓冲中每3个字符包含24个bit,这24个bit正好可以转成4个Base64字符,所以没3个字符能组成一个转换循环,如果输入缓冲中字符的个数是3的整数倍,那么结果就是4的整数倍,两者的长度是3:4的关系,但是如果输入字符不是3的整数倍呢?这就涉及到了末尾填充问题。
pOutput[iDstLen++] = AVal(a2);
pOutput[iDstLen++] = '=';
pOutput[iDstLen++] = '=';
pOutput[iDstLen] = 0x00;
}
else if (remain == 2)
{
// should pad one equal sign
255,255,255,255, 255,255,255,255, 255,255,255,62, 255,255,255,63,
52,53,54,55, 56,57,58,59, 60,61,255,255, 255,255,255,255,
255,0,1,2, 3,4,5,6, 7,8,9,10, 11,12,13,14,
输入缓冲的末尾可能余下一个字符,或两个字符:
如果余下一个字符,前6个bit转换成Base64,剩下的低2位要右边补0,凑成6bit,然后转换成Base64,为了让解析者了解这个情况,在输出缓冲的最后要补上两个'='。
如果余下两个字符,同样转换出两个Base64字符后,在剩下的4个bit右边补0,凑成6bit,然后转换成Base64,同样在输出缓冲的末尾要补上一个'='。
Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中,这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。至于为什么要进行这个转换呢,最初主要使用在EMail领域,早期的一些邮件网关只识别ASCII,如果发现邮件里有其他字符,就会将它们过滤掉,这样中文的邮件,有图片附件的邮件在这些网关上就会发生问题,于是将中文和图片都使用base64编码然后传输,接受后再解码就客服了这个问题了。Base64除了可以使用在相似场合,还可以用作简单的加密等等。下面介绍下Base64的方法:
i = iSrcLen-2;
BYTE a1 = (pInput[i] >> 2);
BYTE a2 = ( ((pInput[i] & 0x03) << 4) | (pInput[i+1] >> 4));
BYTE a3 = ( (pInput[i+1] & 0x0F) << 2);
pOutput[a4 = (pInput[i*3+2] & 0x3F);
pOutput[i*4] = AVal(a1);
pOutput[i*4+1] = AVal(a2);
pOutput[i*4+2] = AVal(a3);
pOutput[i*4+3] = AVal(a4);
}
iDstLen = i*4;
};
#define BVal(x) Base64IdxTab[x]
int CSeeBase64Dlg::DecodeBase64(char * pInput, char * pOutput)
{
int i = 0;
int iCnt = 0;
int iSrcLen = (int)strlen(pInput);
首先是Base64中可能出现的所有字符:
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
}
return iDstLen;
}
下面是解析的:
const BYTE Base64IdxTab[128] =
{
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
switch (iCnt)
{
case 0:
{
*p = a << 2;
iCnt++;
}
break;
case 1:
{
*p++ |= a >> 4;
*p = a << 4;
iCnt++;
}
break;
case 2:
{
*p++ |= a >> 2;
*p = a << 6;
iCnt++;
}
break;
case 3:
for (i=0; i < loop; i++)
{
BYTE a1 = (pInput[i*3] >> 2);
BYTE a2 = ( ((pInput[i*3] & 0x03) << 4) | (pInput[i*3+1] >> 4) );
BYTE a3 = ( ((pInput[i*3+1] & 0x0F) << 2) | ((pInput[i*3+2] & 0xC0) >> 6) );
if (remain == 1)
{
// should pad two equal sign
i = iSrcLen-1;
BYTE a1 = (pInput[i] >> 2);
BYTE a2 = ((pInput[i] & 0x03) << 4);