[c] base64
/
* Program:
* base64 encode & decode
* Author:
* brant-ruan * Date: * 2016-02-29 * Usage:
* Encode:
* ./base64 -e src-file dst-file
* Decode:
* ./base64 -d src-file dst-file
* P.S.
* To use this tool correctly, you must ensure that your src-file is valid.
Update:
* 2016-03-07
* I choose stdout as output file and stdin as input by default to abide by Linux
* philosophy.(So you can use pipe instruction)
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0
#define ERROR -1
#define CHART_SIZE 64
typedef int Status;
// standard base64 encoding chart
char std_chart[CHART_SIZE+1] = {
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"
};
Status Encode();
Status Decode();
void MsgPrt(char *msg);
int main(int argc, char **argv)
{
if(argc != 2){
MsgPrt(argv[0]);
}
else if(strcmp("-e", argv[1]) == 0){
Encode();
}
else if(strcmp("-d", argv[1]) == 0){
Decode();
}
else{
MsgPrt(argv[0]);
}
return OK;
}
/* print error when arguments error happen */
void MsgPrt(char *msg)
{
printf("Usage:\n");
printf("\tEncode: %s -e src-file des-file\n", msg);
printf("\tDecode: %s -d src-file des-file\n", msg);
}
/* base64 encoding */
Status Encode()
{
char in[3];
char tempc;
// Encoding process
int i = 0;
while((tempc = fgetc(stdin)) != EOF){
in[i++] = tempc;
if(i == 3){
// char 1
tempc = (in[0] >> 2) & 0x3f;
fputc(std_chart[tempc], stdout);
// char 2
tempc = ((in[0] << 4) & 0x30) | ((in[1] >> 4) & 0x0f);
fputc(std_chart[tempc], stdout);
// char 3
tempc = ((in[1] << 2) & 0x3c) | ((in[2] >> 6) & 0x03);
fputc(std_chart[tempc], stdout);
// char 4
tempc = in[2] & 0x3f;
fputc(std_chart[tempc], stdout);
// initialize 'i'
i = 0;
}
}
// if the file's size is not times of 3:
if(i != 0){
tempc = (in[0] >> 2) & 0x3f;
fputc(std_chart[tempc], stdout);
}
if(i == 1){ // if there is 1 byte rest
tempc = (in[0] << 4) & 0x30;
fputc(std_chart[tempc], stdout);
fputc('=', stdout);
fputc('=', stdout);
}
if(i == 2){ // if there are 2 bytes rest
tempc = ((in[0] << 4) & 0x30) | ((in[1] >> 4) & 0x0f);
fputc(std_chart[tempc], stdout);
tempc = (in[1] << 2) & 0x3c;
fputc(std_chart[tempc], stdout);
fputc('=', stdout);
}
fclose(stdin);
return OK;
}
/* return the index of char in std_chart */
char ReIndex(char tempc)
{
int i;
for(i = 0; (i<CHART_SIZE) && (std_chart[i] != tempc); i++)
;
if(i < CHART_SIZE)
return i;
return ERROR;
}
/* base64 decoding */
Status Decode()
{
char in[4];
char tempc;
// Decoding process
int i = 0;
while((tempc = fgetc(stdin)) != EOF){
if(tempc == '=') // go to Extra situation
break;
in[i++] = ReIndex(tempc);
if(i == 4){
// char 1
tempc = (in[0] << 2) | ((in[1] >> 4) & 0x03);
fputc(tempc, stdout);
// char 2
tempc = (in[1] << 4) | (in[2] >> 2);
fputc(tempc, stdout);
// char 3
tempc = (in[2] << 6) | (in[3] & 0x3f);
fputc(tempc, stdout);
i = 0;
}
}
if(tempc == '='){ // Extra situation
tempc = (in[0] << 2) | ((in[1] >> 4) & 0x03);
fputc(tempc, stdout);
if(i == 3){
tempc = (in[1] << 4) | (in[2] >> 2);
fputc(tempc, stdout);
}
}
return OK;
}
[c] base64的更多相关文章
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- java单向加密算法小结(1)--Base64算法
从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...
- URI编码解码和base64
概述 对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent. ...
- 通过HTML5的Drag and Drop生成拓扑图片Base64信息
HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...
- Base-64 字符数组或字符串的长度无效等问题解决方案
项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...
- android Base64 加密
一 Base64加密 import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStre ...
- When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)
关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
随机推荐
- 如何在window Form中使用Font Awesome?
随着技术的发展,web上以前的图片按钮现在逐步换成了图标字体,这些图标字体是矢量的,矢量图意味着每个图标都能在所有大小的屏幕上完美呈现,可以随时更改大小和颜色,而且不失真,真心给人一种“高大上”的感觉 ...
- 25个最佳的 WordPress Gallery 画廊插件
WordPress 画廊插件最适合用于作品展示网站,特别对于那些想以一个奇特的,现代的方式展示他们作品的摄影师.如果你想为你安装 WordPress Gallery 插件,那么下面的是你想要的. 本文 ...
- HTML5 模拟现实物理效果,感受 Web 技术魅力
Ball Pool 是一个基于 HTML5 技术的实验,模拟现实物理效果,让你在 Web 中感受自然物体的运动.玩法介绍:可以随意拖动圆球.点击页面背景.晃动浏览器.双击页面背景或者按住鼠标左键,有不 ...
- 【移动适配】移动Web怎么做屏幕适配(三)
复杂纷扰的世界背后,总会有万变不离其宗的简单规则 啃先生 Mar.8th.2016 壹 | Fisrt 前面写了两篇移动适配相关的文章: <移动Web怎么做屏幕适配(一)>重点介绍了怎样利 ...
- DOM事件探秘
说到DOM事件,就不得不说以下几点: 1 事件流 事件流:描述的是从页面中接受事件的顺序 事件流分为事件冒泡流和事件捕获流.那么什么是事件冒泡,什么是事件捕获呢? 事件冒泡:即事件最开始由最具体的元素 ...
- WIFI热点
1.wifi热点是指把手机的接收GPRS.3G或4G信号转化为wifi信号再发出去,这样手机就成了一个WIFI热点. 2.手机必须有无线AP功能,才能当做热点.有些系统自带建热点这个功能比如IOS(比 ...
- commandline (命令行)登录mysql
mysql登录在命令行登录的时候是通过mysql的里面的程序的录的 其登录格式有两种:(在oracle上看到的是列出这两种,不要既有全参数名又有缩写参数名.) 1.全参数名登录释例 mysql --h ...
- 【代码笔记】iOS-带输入框的UIAlertView
一,效果图. 二,代码. //点击任何处,弹出输入框 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIAlertV ...
- 浅谈JSON数据解析方法
JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...
- MVC 生成图片,下载文件(图片不存在本地,在网上下载)
/// <summary> /// 生成图片 /// </summary> /// <param name="collection"></ ...