base64编码和解码
来源:互联网 发布:java 读取文件名称 编辑:程序博客网 时间:2024/05/17 20:32
引用:百度百科 base64编码
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
-----------------------------------------------------------------------------------------------------------------------------------------------
base64编码,现在都有很多库可以直接实现,这里只是自己熟悉下base64是如何编码和解码的。
编码字节表示
百科里有详细介绍base64是如何截取字节位的,这里是一个简图。红色框内是原始字节位表示,黑色表示组合后的。都是在6位前补00组成一个字节。
解码字节位表示。
c语言代码。简略描述编码解码过程,
#include <stdio.h>#include <stdlib.h>#include <string.h>//定义base64解码表,最后一个是字符串结尾标志static char Base64Code[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','=','\0'};//编码char* enbase(char *buf){ //字符数组的长度,传入的字符串默认有'\0'结束符,如果直接传入字节,应该自定义 传入一个len长度 int length=strlen(buf); //指针引用 char* debase,*p; //声明内存,解码时,转换后长度和原始长度关系为 length/3*4 p=debase=malloc((length%3==0?length/3*4:(length/3+1)*4)*sizeof(char)); int i; //声明几个辅助变量 char b1,b2,b3,temp; //3次进行一次迭代 for (i=0;i<length;i=i+3){ b1=buf[i]; //第一个字节转换,右移动2位,与0x3f保证头2位字节为0 *(p++)=Base64Code[((b1>>2)&0x3f)]; /*检测第二个字节是否存在,没有补0*/ b2=(i+1)>=length?0:buf[i+1]; /*第一字节左移4位,加上第二字节右移4位,同时其他位字节抛弃*/ *(p++)=Base64Code[(((b1<<4)&0x3f)+((b2>>4)&0xf))]; /*同样是检测第3个字节是否存在,补0*/ b3=(i+2)>=length?0:buf[i+2]; /*第2个字节左移2位,加上第3字节右移6位*/ temp=b2==0?64:(((b2<<2)&0x3f)+((b3>>6)&0x3)); *(p++)=Base64Code[temp]; /*第3字节与0x3f取低6位*/ *(p++)=Base64Code[b3==0?64:(b3&0x3f)]; } *(p)='\0'; return debase;}/*根据码表取索引*/char getIndex(char c,char* buf){ int i; for (i=0;i<strlen(buf);++i){ if (c==buf[i]){return i;} } return 0;}/*解码*/char* debase(char* buf){ /*辅助变量*/ char b1,b2,b3,b4; int i; /*strlen在传入字符串有'\0'下正常获取长度*/ int length=strlen(buf); char* debase,*p; /* 声明内存,转换后长度和输入长度关系为length/4*3 */ p=debase=malloc((length/4*3)*sizeof(char)); for (i=0;i<length;i=i+4){ /*获取对应字节的索引值*/ b1=getIndex(buf[i],Base64Code); b2=getIndex(buf[i+1],Base64Code); b3=getIndex(buf[i+2],Base64Code); b4=getIndex(buf[i+3],Base64Code); /*第一字节左移2位,加上第二字节右移4位*/ *(p++)=((b1<<2)+((b2>>4)&0x3)); if (b3!=64){ /* base64编码,编码的过程就保证了,只有第三位和第四为可能为=号,就是=号最多有2个。 当第三字节不为=号时,取 第二字节左移4位加第三字节右移2位 */ *(p++)=((b2&0x0f)<<4)+((b3>>2)&0xf); if (b4!=64){ /*第三字节左移6位*/ *(p++)=((b3<<6)+b4); } } } /*最后补0 字符串结尾*/ *(p)='\0'; return debase;}
- base64编码和解码
- BASE64编码和解码
- base64编码和解码
- base64编码和解码
- BASE64 编码和解码
- Base64编码和解码
- BASE64编码和解码
- base64编码和解码
- BASE64编码和解码
- Base64编码和解码
- BASE64编码和解码
- base64编码和解码
- BASE64编码和解码
- BASE64编码和解码 .
- base64编码和解码
- base64编码和解码
- Base64编码和解码
- JavaScript Base64编码和解码
- error c2129:静态函数**已声明但未定义
- CSS中定义a:link、a:visited、a:hover、a:active顺序问题探讨【经验】
- 第17周任务1-1——函数参数传递
- socket编程中recv的错误使用
- UNIX时间戳的应用-JAVA
- base64编码和解码
- 无人值守安装SQL Server 2008 R2
- Android硬件抽象层(HAL)概要介绍和学习计划 .
- Cygwin 使用
- C# 操作ZedGraphChart
- linux驱动头文件说明
- Reading LIST output(一)
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)
- netstat