base64 源码

简介:
/* base64.c: MIME BASE64编码与解码器,读标准输入. 赵建军, 2000.1.12.a */
/* 2000.2.19.A: 增文件处理. */
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"
char    *base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
union
{
 struct
 {
  unsigned long d:6;
  unsigned long c:6;
  unsigned long b:6;
  unsigned long a:6;
 }s;
 unsigned char  c[3];
}u;
int     decode=0;
main(int argc,char **argv)
{
 extern char    *optarg;
 extern int     optind;
 int            c;
 FILE           *fp;
 while ((c=getopt(argc,argv,"u"))!=EOF)
 {
  switch(c)
  {
   case 'u': decode=1; break;
   default: usage(); break;
  }
 }
 if (argc==optind)
 {
  if (isatty(0)) usage();
  if (decode) base64decode(stdin,stdout); else base64encode(stdin,stdout);
 }
 else
 for (;optind<argc;optind++)
 {
  fp=fopen(argv[optind],"r");
  if (fp==0) { fprintf(stderr,"%s: fopen %s error.\n",argv[0],argv[optind]); continue; }
  if (decode) base64decode(fp,stdout); else base64encode(fp,stdout);
  fclose(fp);
 }
 exit(0);
}
usage()
{
 fprintf(stderr,"base64: MIME BASE64 encoder and decoder, by zzz ( zhsoft@371.net) at 2000.1.11.m\n");
 fprintf(stderr,"Usage: base64 [-u] [file1] [file2] ...\n");
 exit(1);
}
base64encode(FILE *fp,FILE *fq)
{
 int    ch,n,h=0,flag=0;
 while (1)
 {
  u.c[0]=u.c[1]=u.c[2]=0;
  for (n=0;n<3;n++)
  {
   ch=fgetc(fp);
   if (ch==EOF) break;
   u.c[2-n]=ch;
  }
  if (n==0) break;
  flag=1;
  switch(n)
  {
   case 1: fprintf(fq,"%c%c==",base[u.s.a],base[u.s.b]);break;
   case 2: fprintf(fq,"%c%c%c=",base[u.s.a],base[u.s.b],base[u.s.c]);break;
   case 3: fprintf(fq,"%c%c%c%c",base[u.s.a],base[u.s.b],base[u.s.c],base[u.s.d]);break;
  }
  if (h==15) { h=0; fprintf(fq,"\n"); } else h++;
 }
 if (flag&&h) fprintf(fq,"\n");
}
base64decode(FILE *fp,FILE *fq)
{
 int    c1,c2,c3,c4;
 while (1)
 {
  /* c1 */
  c1=fgetc(fp);
  while (c1!=EOF&&isspace(c1)) c1=fgetc(fp);
  if (c1==EOF) break;
  if (strchr(base,c1)==NULL&&c1!='=')
  {
   fprintf(fq,"Error: %c : not BASE64 code!\n",c1);
   return 1;
  }
  /* c2 */
  c2=fgetc(fp);
  if (c2==EOF)
  {
   fprintf(fq,"Error: unexpected EOF in BASE64 code!\n");
   return 1;
  }
  if (strchr(base,c2)==NULL&&c2!='=')
  {
   fprintf(fq,"Error: %c : not BASE64 code!\n",c2);
   return 1;
  }
  /* c3 */
  c3=fgetc(fp);
  if (c3==EOF)
  {
   fprintf(fq,"Error: unexpected EOF in BASE64 code!\n");
   return 1;
  }
  if (strchr(base,c3)==NULL&&c3!='=')
  {
   fprintf(fq,"Error: %c : not BASE64 code!\n",c3);
   return 1;
  }
  /* c4 */
  c4=fgetc(fp);
  if (c4==EOF)
  {
   fprintf(fq,"Error: unexpected EOF in BASE64 code!\n");
   return 1;
  }
  if (strchr(base,c4)==NULL&&c4!='=')
  {
   fprintf(fq,"Error: %c : not BASE64 code!\n",c4);
   return 1;
  }
  /* check format:[A-Za-z0-9+/][A-Za-z0-9+/][A-Za-z0-9+/=][A-Za-z0-9+/=] */
  if (strchr(base,c1)&&strchr(base,c2)&&(strchr(base,c3)||c3=='=')&&
        ((c3=='='&&c4=='=')||(c3!='='&&(c4=='='||strchr(base,c4)))))
  {
   u.s.a=strchr(base,c1)-base;
   u.s.b=strchr(base,c2)-base;
   if (c3=='=')
   {
    /* one byte output */
    fprintf(fq,"%c",u.c[2]);
   }
   else
   if (c4=='=')
   {
    /* two byte output */
    u.s.c=strchr(base,c3)-base;
    fprintf(fq,"%c%c",u.c[2],u.c[1]);
   }
   else
   {
    /* three byte output */
    u.s.c=strchr(base,c3)-base;
    u.s.d=strchr(base,c4)-base;
    fprintf(fq,"%c%c%c",u.c[2],u.c[1],u.c[0]);
   }
  }
  else
  {
   fprintf(fq,"Error: %c%c%c%c : not BASE64 code!\n",c1,c2,c3,c4);
   return 1;
  }
 }
 return 0;
}
 
 
网上找到的,
保存到一个.c的文件,比如说base64.c,然后用gcc编译一下,就可以用来,gcc不指定输出,直接编译成一个a.out的文件,把a.out重命名成base64就行了。
 
 gcc base64.c -o base64 就行了。
 
加密解密测试:
 
[root@localhost ~]# echo "zhaoyun" | ./base64
emhhb3l1bgo=
[root@localhost ~]# echo "emhhb3l1bgo=" | ./base64 -u
zhaoyun
[root@localhost ~]#
 
 本文转自zhaoyun00 51CTO博客,原文链接:http://blog.51cto.com/zhaoyun/716839
 
相关文章
|
8月前
|
Java
java base64转doc文件
以下是使用Java进行Base64转换的例子: 1. 使用Java Base64工具类进行转换 ```java // 导入相关包 import java.util.Base64; import java.io.FileOutputStream; import java.io.IOException; // 将Base64字符串转换为字节数组 byte[] decodedBytes = Base64.getDecoder().decode(base64String); // 将字节数组写入到文件中 try (FileOutputStream fos = new FileOutputStrea
193 0
|
8月前
|
存储 前端开发 JavaScript
前端base64转file文件方法
前端base64转file文件方法
725 0
|
Java PHP 数据安全/隐私保护
php base64_decode与java base64解密结果不匹配问题
php base64_decode与java base64解密结果不匹配问题
220 0
|
机器学习/深度学习 算法 数据可视化
Induction base
Induction base 是一种基于归纳推理的算法或方法,通常用于解决机器学习或数据挖掘中的问题,特别是关联规则挖掘和分类问题。其基本思想是基于一些基本的规则或假设,通过反复应用于数据来推导出更复杂的规则或结论。
45 1
|
C语言
BASE系列
BASE系列
133 0
|
运维 算法 数据挖掘
Proximity-Base Approaches|学习笔记
快速学习 Proximity-Base Approaches
Proximity-Base Approaches|学习笔记
|
JavaScript PHP
Base64初探
base64是一种编码格式。
941 0
Base64初探
Base64工具类
Base64工具类
140 0