`
lindexi-gd
  • 浏览: 135783 次
社区版块
存档分类
最新评论

C语言 实现base64

 
阅读更多
#include <stdio.h> 
const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
char* base64_encode(const char* data, int data_len); 
char *base64_decode(const char* data, int data_len); 
static char find_pos(char ch); 
int main(int argc, char* argv[]) 
{ 
    char *t = "那个abcd你好吗,哈哈,ANMOL"; 
    int i = 0; 
    int j = strlen(t); 
    char *enc = base64_encode(t, j); 
    int len = strlen(enc); 
    char *dec = base64_decode(enc, len); 
    printf("\noriginal: %s\n", t); 
    printf("\nencoded : %s\n", enc); 
    printf("\ndecoded : %s\n", dec); 
    free(enc); 
    free(dec); 
    return 0; 
} 
/* */ 
char *base64_encode(const char* data, int data_len) 
{ 
    //int data_len = strlen(data); 
    int prepare = 0; 
    int ret_len; 
    int temp = 0; 
    char *ret = NULL; 
    char *f = NULL; 
    int tmp = 0; 
    char changed[4]; 
    int i = 0; 
    ret_len = data_len / 3; 
    temp = data_len % 3; 
    if (temp > 0) 
    { 
        ret_len += 1; 
    } 
    ret_len = ret_len*4 + 1; 
    ret = (char *)malloc(ret_len); 

    if ( ret == NULL) 
    { 
        printf("No enough memory.\n"); 
        exit(0); 
    } 
    memset(ret, 0, ret_len); 
    f = ret; 
    while (tmp < data_len) 
    { 
        temp = 0; 
        prepare = 0; 
        memset(changed, '\0', 4); 
        while (temp < 3) 
        { 
            //printf("tmp = %d\n", tmp); 
            if (tmp >= data_len) 
            { 
                break; 
            } 
            prepare = ((prepare << 8) | (data[tmp] & 0xFF)); 
            tmp++; 
            temp++; 
        } 
        prepare = (prepare<<((3-temp)*8)); 
        //printf("before for : temp = %d, prepare = %d\n", temp, prepare); 
        for (i = 0; i < 4 ;i++ ) 
        { 
            if (temp < i) 
            { 
                changed[i] = 0x40; 
            } 
            else 
            { 
                changed[i] = (prepare>>((3-i)*6)) & 0x3F; 
            } 
            *f = base[changed[i]]; 
            //printf("%.2X", changed[i]); 
            f++; 
        } 
    } 
    *f = '\0'; 

    return ret; 

} 
/* */ 
static char find_pos(char ch)   
{ 
    char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[] 
    return (ptr - base); 
} 
/* */ 
char *base64_decode(const char *data, int data_len) 
{ 
    int ret_len = (data_len / 4) * 3; 
    int equal_count = 0; 
    char *ret = NULL; 
    char *f = NULL; 
    int tmp = 0; 
    int temp = 0; 
    char need[3]; 
    int prepare = 0; 
    int i = 0; 
    if (*(data + data_len - 1) == '=') 
    { 
        equal_count += 1; 
    } 
    if (*(data + data_len - 2) == '=') 
    { 
        equal_count += 1; 
    } 
    if (*(data + data_len - 3) == '=') 
    {//seems impossible 
        equal_count += 1; 
    } 
    switch (equal_count) 
    { 
    case 0: 
        ret_len += 4;//3 + 1 [1 for NULL] 
        break; 
    case 1: 
        ret_len += 4;//Ceil((6*3)/8)+1 
        break; 
    case 2: 
        ret_len += 3;//Ceil((6*2)/8)+1 
        break; 
    case 3: 
        ret_len += 2;//Ceil((6*1)/8)+1 
        break; 
    } 
    ret = (char *)malloc(ret_len); 
    if (ret == NULL) 
    { 
        printf("No enough memory.\n"); 
        exit(0); 
    } 
    memset(ret, 0, ret_len); 
    f = ret; 
    while (tmp < (data_len - equal_count)) 
    { 
        temp = 0; 
        prepare = 0; 
        memset(need, 0, 4); 
        while (temp < 4) 
        { 
            if (tmp >= (data_len - equal_count)) 
            { 
                break; 
            } 
            prepare = (prepare << 6) | (find_pos(data[tmp])); 
            temp++; 
            tmp++; 
        } 
        prepare = prepare << ((4-temp) * 6); 
        for (i=0; i<3 ;i++ ) 
        { 
            if (i == temp) 
            { 
                break; 
            } 
            *f = (char)((prepare>>((2-i)*8)) & 0xFF); 
            f++; 
        } 
    } 
    *f = '\0'; 
    return ret; 
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    c语言实现base64编码

    C语言实现Base64编码通常涉及到以下几个核心概念和步骤: 1. **Base64字符集**: Base64编码使用64个字符来表示二进制数据,这些字符包括大写字母(A-Z)、小写字母(a-z)、数字(0-9)以及两个特殊字符`+`和`/`...

    C语言实现base64

    C语言实现Base64编码通常包括以下几个步骤: 1. **预处理**:检查输入数据的长度,如果不足3字节,则需要在末尾填充0字节,以保证可以完整地分组。 2. **分组**:将输入数据按照每3字节一组进行划分。 3. **编码*...

    C语言实现Base64编解码(加密和解密).zip

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二...本资源使用C语言实现Base64加密和解密,可以实现数据的加密和文件的加密,不借助任何的第三方工具,便于移植。

    c语言实现base64编码解码

    用c语言实现的base64,包括加密算法和解密算法。

    C语言实现Base64编码与解码

    在"C语言实现Base64编码与解码"的项目中,我们有`Encode.c`这个源文件,它包含了Base64编码和解码的实现。下面我们将深入探讨Base64的基本原理以及如何用C语言来实现。 1. **Base64编码原理**: - Base64编码基于...

    c语言实现base64编解码

    Base64是一种编码方式,常用于在网络上传输二...以上就是关于C语言实现Base64编解码的相关知识点,包括原理、关键步骤、注意事项以及可能的实现代码片段。理解并掌握这些内容,你就可以编写出自己的Base64编码库了。

    C语言实现base64编码与解码

    综上所述,C语言实现Base64编码与解码涉及到了二进制数据的处理、字符串操作、字符映射、内存管理和错误处理等多个方面的知识。通过理解和掌握这些概念,可以编写出高效、可靠的Base64工具。在提供的压缩包文件中,...

    Base64编码解码c语言实现

    总的来说,C语言实现Base64编码解码需要深入理解二进制数据和字符编码之间的转换,并能熟练运用位运算和字符串处理技术。通过这个过程,不仅可以学习到编码解码的基本原理,还能锻炼C语言编程能力。

    base16 base32 base64 C语言代码

    C语言实现Base64编码通常需要处理边界情况,如不足三位的数据,通过添加填充位(通常是"=")来完成。 在提供的压缩包中,有`.c`和`.h`文件,这些是C语言源代码和头文件。例如,`base16.c`和`base16.h`组合包含了...

    base64编解码的C语言实现

    base64的C语言实现,能够快速实现base64的编解码

    base64编码与解码C语言实现(带注释说明原理)

    base64编码与解码C语言实现(带注释说明原理) 其中包括:base64编码接口和base64解码接口

    C语言Base64 编码

    C语言实现Base64编码和解码是常见的编程任务,它涉及字符映射、位操作和缓冲区管理等核心概念。 Base64编码的基本原理是将每3个字节(24位)的数据转换为4个6位的“Base64字符”,这样可以确保所有的二进制数据都能...

    C语言base64编码解码库

    C语言是编程语言的基础,被广泛应用于系统编程和嵌入式开发,因此一个C语言实现的Base64编码解码库对于开发者来说非常有用。下面将详细介绍这个名为"C语言base64编码解码库"的资源。 该库是从GitHub上获取的,这...

    011_Base64 编解码C语言实现

    C语言实现Base64编解码可以帮助开发者在C程序中处理这类数据转换需求。 在C语言中实现Base64编解码,通常包括以下几个关键步骤: 1. **编码过程**: - **分组**:将输入的二进制数据按3个字节一组进行处理,不足3...

    Base64加密解密_C语言实现和VC实现

    C语言实现Base64加密和解密通常涉及以下几个步骤: 1. **编码过程**:首先,将输入的二进制数据按每3个字节分组,然后将每个组转换为4个6位的二进制数,接着将这4个二进制数映射到Base64字符集中对应的字符。对于...

    Base64加密算法C语言代码实现

    Base64编码的核心原理是将二进制数据进行分组,每24Bit(3字节)为一个大组,再把一个大组的数据分成4个6Bit的小分组。由于6Bit数据只能表示64个不同的字符(2^6=64),所以这也是Base64的名字由来。

    base64 编码解码 c语言 实现.docx

    在C语言中实现Base64编码解码需要了解编码和解码的算法。 Base64编码算法: Base64编码算法将二进制数据分成每三个字节一组,对每组数据进行编码。编码过程包括三个步骤: 1. 将二进制数据分成每三个字节一组。 2...

    c语言的base64编解码函数

    C语言中的Base64编解码函数可以帮助开发者在程序中实现这种转换。 首先,我们要理解Base64的编码原理。Base64编码表包含64个可打印的ASCII字符:A-Z、a-z、0-9、'+'和'/'。每个6位的数字对应一个字符,第65和66个...

Global site tag (gtag.js) - Google Analytics