/
* 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的更多相关文章

  1. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  2. Base64编码

    Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...

  3. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  4. java单向加密算法小结(1)--Base64算法

    从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...

  5. URI编码解码和base64

    概述 对于uri的编解码,在js中有3对函数,分别是escape/unescape,encodeURI/decodeURI,encodeURIComponent/decodeURIComponent. ...

  6. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  7. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  8. android Base64 加密

    一 Base64加密 import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStre ...

  9. When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)

    关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...

  10. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

随机推荐

  1. jQuery立体式数字动态增加(animate方法)

    1.HTML结构 <div class="integral">已有<span class="ii"></span>积分< ...

  2. css布局模式

    css布局模型在网页中,元素有三种布局模型: 流动模型(Flow) 浮动模型 (Float) 层模型(Layer) 流动Flow模型(一): 流动(Flow)是默认的网页布局模式.也就是说网页在默认状 ...

  3. 浅谈-js递归函数

    所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 下面我们就做一个10以内的阶乘试试看吧: [Ctrl+A 全选 ...

  4. html5音频和视频标签

    在html5之前的版本中如果想要在网页中插入音频和视频必须要安装插件才可以,比如最常见的flash插件.很多人在刚安装一款浏览器的时候都会遇到浏览器建议安装flash插件,在移动端也是如此.如果想要在 ...

  5. 新建WEB前端开发技术交流群---期待你的加入

    这几天创建了一个前端开发的技术交流群,面向的对象主要包括正在学习前端开发的和即将步入前端开发行列的小伙伴儿,主要是为大家提供一个共同学习,共同进步的开放平台.无论你现在是在自学中,还是在培训中,甚至是 ...

  6. 设置时间 new Date

    1.标准格式下的时间是object ,操作时可以通过 var cDate=new Date(startTime.getTime());来复制当前日期避免操作给初始日期带来影响 2. 以月为单位计算想要 ...

  7. sass高级语法

    github地址:https://github.com/lily1010/sass/tree/master/course03 用到的sass语法是: sass --watch test.scss:te ...

  8. JavaScript强化教程——jQuery UI API 类别

    ---恢复内容开始--- 主要介绍:JavaScript强化教程​—— jQuery UI API 类别 jQuery UI 在jQuery 内置的特效上添加了一些功能.jQuery UI 支持颜色动 ...

  9. 一维Poisson方程计算

    package com.smartmap.algorithm.equation.differential.partial.ellipsoidal; import java.io.FileOutputS ...

  10. SharePoint 2013 中如何使用Silverlight

    1.打开VS,创建一个Silverlight程序,如下图: 2.配置选择默认的,当然也可以不勾选Host Application,如下图: 3.添加Silverlight控件,2个label和1个bu ...