C语言实现Base64编解码

in_str是输入缓冲区的地址

in_len 要编码的数据的长度

out_str 输出的地址

需要在外面分配内存

unsigned char *out_str = (unsigned char *) malloc (in_len * 4 / 3 + 1);

然后再调用函数编码。

void Base64Encode(const unsigned char *in_str, int in_len, unsigned char *out_str)
{
static unsigned char base64[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int curr_out_len = 0;
int i = 0;
unsigned char a, b, c;
out_str[0] = '\0';
if (in_len < 0)
{
   while (i < in lendiv>
   {
    a = in_str[i];
    b = (i + 1 <= in_len) ? 0 : in_str[i + 1];
    c = (i + 2 <= in_len) ? 0 : in_str[i + 2];
    if (i + 2 < in lendiv>
    {
     out_str[curr_out_len++] = (base64[(a << 2) & 0x3F]);
     out_str[curr_out_len++] = (base64[((a < x b >< 4) & 0xf)]);
     out_str[curr_out_len++] = (base64[((b < xc c >< 6) & 0x3)]);
     out_str[curr_out_len++] = (base64[c & 0x3F]);
    }
    else if (i + 1 < in lendiv>
    {
     out_str[curr_out_len++] = (base64[(a << 2) & 0x3F]);
     out_str[curr_out_len++] = (base64[((a < x b >< 4) & 0xf)]);
     out_str[curr_out_len++] = (base64[((b < xc c >< 6) & 0x3)]);
     out_str[curr_out_len++] = '=';
    }
    else
    {
     out_str[curr_out_len++] = (base64[(a << 2) & 0x3F]);
     out_str[curr_out_len++] = (base64[((a < x b >< 4) & 0xf)]);
     out_str[curr_out_len++] = '=';
     out_str[curr_out_len++] = '=';
    }
    i += 3;
   }
   out_str[curr_out_len] = '\0';
}
return;
}

网上的解码函数,都是解码成字符串的,如果解码并保存到文件中,那么往往会多保存几个字节,主要是对base64字符串最后面的=号的判断不够,所以只要自行实现了一下:

void __stdcall Base64DecodeToFile(unsigned char *input, const unsigned char *dst_filename)
{
static int map[256] = {0};
static unsigned char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
size_t inplen = strlen(input);
int words = (inplen+3)/4;
size_t i=0, j=0;
int word = 0;
char *p = input;
int padnum = 0;
FILE *fd = NULL;
for (i = 0; i < 64 idiv>
{
   map[(int)b64[i]]=i;
}
if(input[inplen - 1] == '=') padnum = 1;
if(input[inplen - 1] == '=' && input[inplen - 2] == '=') padnum = 2;
fd = fopen(dst_filename,"wb");
if (fd == NULL) return;
for(i=0; i
{
   word = 0;
   word |= map[(int)*p++];
   word < div>
   word |= map[(int)*p++];
   word < div>
   word |= map[(int)*p++];
   word < div>
   word |= map[(int)*p++];
   fprintf(fd, "%c", word << 16 & 0xFF);
   if (i + 1 == words && padnum == 2)
    break;
   fprintf(fd, "%c", word << 8 & 0xFF);
   if (i + 1 == words && padnum == 1)
    break;
   fprintf(fd, "%c", word & 0xFF);
}
fclose(fd);
return;
}
时间: 2024-10-31 01:25:40

C语言实现Base64编解码的相关文章

iOS 中 Base64 编解码分类实现

iOS 中 Base64 编解码分类实现 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 再补充:由此可见,当一个人极力地想要说明自已,表述清楚自已的想法的时侯,最后会被自已搞得更加不清楚了,从

解密-关于C语言的base64字符串解码

问题描述 关于C语言的base64字符串解码 各位大神,我现在急需将一段字符串解码的方法(C语言实现),希望各位出手援助一下. 我需要解码的字符串是: vU3xynE6ee6KymPB1cpwVGwZMrS/GZdXYBXiPNWfWktX6uq0gdIKB6yWG8dq49ywRKjCljpVipbTWyHIOEhS0jpSVuB/y4q3rWI3bvMGCWK9/rHLkUrdi4NIQLKj+hFEZbvgmWfdAyc0mvdIcjQOtRKVTFzQUekoJ5RvMAAqNt+usa

Delphi 自带的 Base64 编解码函数

今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个单元提供两套四个公开函数: 对流的编解码: procedure EncodeStream(Input, Output: TStream); // 编码 procedure DecodeStream(Input, Output: TStream); // 解码 // 对字符串的编解码: functio

c++base64编解码使用示例_C 语言

复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>static const char b64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";static const char reverse_table[128

使用python3的base64编解码实现字符串的简易加密解密

import base64 copyright = 'Copyright (c) 2012 Doucube Inc. All rights reserved.' def main(): #转成bytes string bytesString = copyright.encode(encoding="utf-8") print(bytesString) #base64 编码 encodestr = base64.b64encode(bytesString) print(encodestr

MaxCompute SQL引用第三方Base64JAR实现编解码

BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据,其目的是为了简化存储或传输.更具体地说,BASE64算法主要用于转换二进制数据为ASCII字符串格式. 下面我们通过阿里云MaxCompute 和大数据开发套件,引用第三方的Base64 JAR,来实现字符串的编码.解码: 效果如下: ---base64编码 select id,encode_base64('liuxiaowen1234') from alian.user_info limit 1; bGl1eGlhb3dlbjE

node.js学习之base64编码解码_node.js

一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了.最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送.把不可打印的字符也能用可打印字符来表示,问题就解决了.Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法

IP通信中音频编解码技术与抗丢包技术概要

此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一运营商之间也有丢包,在铁通,鹏博士等运营商中尤甚.并且在晚高峰的时候表现更加突出. 2.同一国家不同运营商之间: 在很多时候,由于运营商之间的结算和有限带宽的问题.运营商之间的网络不稳定. 3.不同国家之间: 同一个国家都这么多问题,不同国家的问题回更复杂,在不同的国家要选择好的机房,实时选择实时监

我的Android进阶之旅------&amp;gt;Android中编解码学习笔记

编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,