base64编码__C语言

Base64编码

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。–来源于百度百科

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//base64表
unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int index(char c)
{
    if(c>= 'A' && c<='Z')
        return c-'A';
    else if(c>= 'a' && c<= 'z')
        return c-'a'+26;
    else if(c>= '0' && c<= '9')
        return c-'0'+52;
    else if(c == '+')
        return 62;
    else if(c == '/')
        return 63;
    return -1;
}
//解码
unsigned char* base64_decode(char *str)
{
    unsigned char *de_str;
    int str_len;    //原始字符处的长度
    int de_len;     //解码后字符串的长度

    str_len = strlen(str);


    if(strstr(str,"=="))
        de_len=str_len/4*3-2;
    else if(strstr(str,"="))
        de_len=str_len/4*3-1;
    else
        de_len=str_len/4*3;

    //为解码后的字符串申请空间
    de_str =malloc(sizeof(unsigned char)*de_len+1);
    de_str[de_len] = '\0';

    for(int i=0,j=0;i < str_len-2; i+=4,j+=3)
    {
    de_str[j]=((unsigned char)index(str[i]))<<2 | (((unsigned char)index(str[i+1]))>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合
    de_str[j+1]=(((unsigned char)index(str[i+1]))<<4) | (((unsigned char)index(str[i+2]))>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合
    de_str[j+2]=(((unsigned char)index(str[i+2]))<<6) | ((unsigned char)index(str[i+3])); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
    }

    //因为解码的时候数组其实已经越界了,所以最后再用'\0'截断字符串
    de_str[de_len] = '\0';

    return de_str;
}

//编码
unsigned char * base64_encode(char *str)
{
    unsigned char * en_str;
    int str_len;    //原始字符串长度
    int en_len;     //编码后的字符串长度
//计算经过base64编码后字符串长度
    str_len = strlen(str);
    if(str_len % 3 ==0)
        en_len =(str_len/3)*4;
    else
        en_len = (str_len/3+1)*4; //不够3,补齐到3.

    //为加密后字符串申请存储空间, +1是设置最后一位为\0
    en_str = malloc(sizeof(unsigned char)*en_len+1);
    en_str[en_len] ='\0';

    /*这里有一个补位问题.当最后只剩一下一个字符的时候.
    如 str[j]=01101011 这个时候只能确定第一个字符 011010 还剩下 11.
    刚开始思考怎么用0补充后面的呢.突然想到C语言最后用'\0'结尾都是0刚好可以补位0
    str[j+1]就指向的是'\0'这个地方.所以可以完成补位.然后算出来的str[j+2]和str[j+3]的值是不确定的
    最后用==号填充就好了
    */
    for(int i=0,j=0;i<en_len-2;j+=3,i+=4)
    {
        en_str[i] = base64_table[str[j]>>2];    //取出第一个字符的前六位
        en_str[i+1] = base64_table[(str[j]&0x03)<<4 | (str[j+1]>>4)]; //第一个字符的后两位和第二个字符的前四位
        en_str[i+2] = base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)];//第二个字符的后四位和第三个字符的前两位
        en_str[i+3] = base64_table[str[j+2]&0x3f];  //第三个字符的后六位
    }
    if(str_len % 3==1) //如果凑不够3,则最后两个用=号补充.
    {
        en_str[en_len-2] = '=';
        en_str[en_len-1] = '=';
    }
    else if(str_len % 3 ==2)
    {
        en_str[en_len-1] = '=';
    }
    return en_str;
}
int main()
{
    char *a ="hello world10e";
    char *b ="a";
    char *c =a;
    printf("%x\n",c[1]);
    c =base64_encode(a);
    printf("%s\n",c);
    c =base64_decode(c);
    printf("%s\n",c);
    printf("%s\n",base64_encode(b));
    printf("%s\n",base64_encode(a));
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,你可以使用以下代码来将JPEG图片进行Base64编码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bio.h> #include <openssl/evp.h> char* base64_encode(const unsigned char* buffer, size_t length) { BIO *bio, *b64; FILE* stream; int encodedSize = 4 * ((length + 2) / 3); // 计算编码后的大小 char* base64 = (char*)malloc(encodedSize + 1); stream = fmemopen(base64, encodedSize + 1, "w"); b64 = BIO_new(BIO_f_base64()); bio = BIO_new_fp(stream, BIO_NOCLOSE); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); // 不添加换行符 BIO_write(bio, buffer, length); BIO_flush(bio); BIO_free_all(bio); fclose(stream); return base64; } int main() { FILE* file = fopen("image.jpg", "rb"); if (!file) { printf("无法打开图片文件\n"); return 1; } fseek(file, 0, SEEK_END); long fileSize = ftell(file); fseek(file, 0, SEEK_SET); unsigned char* buffer = (unsigned char*)malloc(fileSize); if (!buffer) { printf("内存分配失败\n"); fclose(file); return 1; } fread(buffer, fileSize, 1, file); fclose(file); char* base64 = base64_encode(buffer, fileSize); printf("%s\n", base64); free(buffer); free(base64); return 0; } ``` 这段代码使用了OpenSSL库中的BIO函数来进行Base64编码。你需要先安装OpenSSL库,然后使用gcc来编译上述代码: ``` gcc -o base64_encode base64_encode.c -lssl -lcrypto ``` 将图片文件命名为"image.jpg",然后运行编译后的可执行文件"base64_encode",即可得到JPEG图片的Base64编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值