日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

对图片进行Base64转码和解码

發布時間:2023/12/19 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 对图片进行Base64转码和解码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Base64代碼

base64.c

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

// bindata待編碼數據buffer  base64 編碼后數據buffer  binlength 待編碼數據大小
char* base64_encode(const unsigned char* bindata, char* base64, int binlength);
// base64編碼字符串 bindata 解碼后buffer
int base64_decode(const char* base64, unsigned char* bindata);

int main()
{
    FILE* fp = NULL;
    unsigned int imageSize;        //圖片字節數
    char* imageBin;
    char* imageBase64;
    char* imageOutput;
    size_t result;
    char* ret;
    unsigned int base64StrLength;

    fp = fopen("lena.bmp", "rb");   //待編碼圖片
    if (NULL == fp)
    {
        printf("file open file");
        return -1;
    }
    //獲取圖片大小
    fseek(fp, 0L, SEEK_END);
    imageSize = ftell(fp);
    fseek(fp, 0L, SEEK_SET);

    //分配內存存儲整個圖片
    imageBin = (char*)malloc(sizeof(char) * imageSize);
    if (NULL == imageBin)
    {
        printf("malloc failed");
        return -1;
    }

    //讀取圖片
    result = fread(imageBin, 1, imageSize, fp);
    if (result != imageSize)
    {
        printf("file read failed");
        return -1;
    }
    fclose(fp);

    //分配編碼后圖片所在buffer
    imageBase64 = (char*)malloc(sizeof(char) * imageSize * 2);//因為編碼一版會比源數據大1/3的樣子,這里直接申請源文件一倍的空間
    if (NULL == imageBase64)
    {
        printf("malloc failed");
        return -1;
    }

    //base64編碼
    base64_encode(imageBin, imageBase64, imageSize);
    base64StrLength = strlen(imageBase64);
    printf("base64 str length:%d
", base64StrLength);
    printf("將圖片讀入out.txt中
");

    //分配存儲解碼數據buffer
    imageOutput = (char*)malloc(sizeof(char) * imageSize);//解碼后應該和源圖片大小一致
    if (NULL == imageBase64)
    {
        printf("malloc failed");
        return -1;
    }
    base64_decode(imageBase64, imageOutput);

    fp = fopen("output.bmp", "wb");
    if (NULL == fp)
    {
        printf("file open file");
        return -1;
    }
    fwrite(imageOutput, 1, imageSize, fp);
    fclose(fp);

    free(imageBin);
    free(imageBase64);
    free(imageOutput);

    return 0;
}

const char* base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char* base64_encode(const unsigned char* bindata, char* base64, int binlength)
{
    int i, j;
    unsigned char current;

    for (i = 0, j = 0; i < binlength; i += 3)
    {
        current = (bindata[i] >> 2);
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)(bindata[i] << 4)) & ((unsigned char)0x30);
        if (i + 1 >= binlength)
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ((unsigned char)(bindata[i + 1] >> 4)) & ((unsigned char)0x0F);
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)(bindata[i + 1] << 2)) & ((unsigned char)0x3C);
        if (i + 2 >= binlength)
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ((unsigned char)(bindata[i + 2] >> 6)) & ((unsigned char)0x03);
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)bindata[i + 2]) & ((unsigned char)0x3F);
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '';
    return 0;
}

int base64_decode(const char* base64, unsigned char* bindata)
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    for (i = 0, j = 0; base64[i] != ''; i += 4)
    {
        memset(temp, 0xFF, sizeof(temp));
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i])
                temp[0] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 1])
                temp[1] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 2])
                temp[2] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 3])
                temp[3] = k;
        }

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2)) & 0xFC)) |
            ((unsigned char)((unsigned char)(temp[1] >> 4) & 0x03));
        if (base64[i + 2] == '=')
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4)) & 0xF0)) |
            ((unsigned char)((unsigned char)(temp[2] >> 2) & 0x0F));
        if (base64[i + 3] == '=')
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6)) & 0xF0)) |
            ((unsigned char)(temp[3] & 0x3F));
    }
    return j;
}

unistd.h

#pragma once
/** This file is part of the Mingw32 package.
unistd.h maps (roughly) to io.h
*/
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */

將Base64編碼存于文件中

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

// bindata待編碼數據buffer  base64 編碼后數據buffer  binlength 待編碼數據大小
char* base64_encode(const unsigned char* bindata, char* base64, int binlength);
// base64編碼字符串 bindata 解碼后buffer
int base64_decode(const char* base64, unsigned char* bindata);

int main()
{
    FILE* fp = NULL;
    unsigned int imageSize;        //圖片字節數
    char* imageBin;
    char* imageBase64;
    char* imageOutput;
    size_t result;
    char* ret;
    unsigned int base64StrLength;

    fp = fopen("lena.bmp", "rb");   //待編碼圖片
    if (NULL == fp)
    {
        printf("file open file");
        return -1;
    }
    //獲取圖片大小
    fseek(fp, 0L, SEEK_END);
    imageSize = ftell(fp);
    fseek(fp, 0L, SEEK_SET);

    //分配內存存儲整個圖片
    imageBin = (char*)malloc(sizeof(char) * imageSize);
    if (NULL == imageBin)
    {
        printf("malloc failed");
        return -1;
    }

    //讀取圖片
    result = fread(imageBin, 1, imageSize, fp);
    if (result != imageSize)
    {
        printf("file read failed");
        return -1;
    }
    fclose(fp);

    //分配編碼后圖片所在buffer
    imageBase64 = (char*)malloc(sizeof(char) * imageSize * 2);//因為編碼一版會比源數據大1/3的樣子,這里直接申請源文件一倍的空間
    if (NULL == imageBase64)
    {
        printf("malloc failed");
        return -1;
    }

    //base64編碼
    base64_encode(imageBin, imageBase64, imageSize);
    base64StrLength = strlen(imageBase64);
    printf("base64 str length:%d
", base64StrLength);
    printf("將圖片讀入out.txt中
");
    FILE* file = fopen("out.txt", "wb");
    if (file == NULL)
    {
        printf("Error!");
        exit(1);
    }
    //將Base64編碼寫入文件
    int i = 0;
    while (imageBase64[i] != NULL)
    {
        fputc(imageBase64[i++], file);
    }
    fclose(file);

    //分配存儲解碼數據buffer
    imageOutput = (char*)malloc(sizeof(char) * imageSize);//解碼后應該和源圖片大小一致
    if (NULL == imageBase64)
    {
        printf("malloc failed");
        return -1;
    }
    base64_decode(imageBase64, imageOutput);

    fp = fopen("output.bmp", "wb");
    if (NULL == fp)
    {
        printf("file open file");
        return -1;
    }
    fwrite(imageOutput, 1, imageSize, fp);
    fclose(fp);

    free(imageBin);
    free(imageBase64);
    free(imageOutput);

    return 0;
}

const char* base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char* base64_encode(const unsigned char* bindata, char* base64, int binlength)
{
    int i, j;
    unsigned char current;

    for (i = 0, j = 0; i < binlength; i += 3)
    {
        current = (bindata[i] >> 2);
        current &= (unsigned char)0x3F;
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)(bindata[i] << 4)) & ((unsigned char)0x30);
        if (i + 1 >= binlength)
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ((unsigned char)(bindata[i + 1] >> 4)) & ((unsigned char)0x0F);
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)(bindata[i + 1] << 2)) & ((unsigned char)0x3C);
        if (i + 2 >= binlength)
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ((unsigned char)(bindata[i + 2] >> 6)) & ((unsigned char)0x03);
        base64[j++] = base64char[(int)current];

        current = ((unsigned char)bindata[i + 2]) & ((unsigned char)0x3F);
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '';
    return 0;
}

int base64_decode(const char* base64, unsigned char* bindata)
{
    int i, j;
    unsigned char k;
    unsigned char temp[4];
    for (i = 0, j = 0; base64[i] != ''; i += 4)
    {
        memset(temp, 0xFF, sizeof(temp));
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i])
                temp[0] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 1])
                temp[1] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 2])
                temp[2] = k;
        }
        for (k = 0; k < 64; k++)
        {
            if (base64char[k] == base64[i + 3])
                temp[3] = k;
        }

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2)) & 0xFC)) |
            ((unsigned char)((unsigned char)(temp[1] >> 4) & 0x03));
        if (base64[i + 2] == '=')
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4)) & 0xF0)) |
            ((unsigned char)((unsigned char)(temp[2] >> 2) & 0x0F));
        if (base64[i + 3] == '=')
            break;

        bindata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6)) & 0xF0)) |
            ((unsigned char)(temp[3] & 0x3F));
    }
    return j;
}

總結

以上是生活随笔為你收集整理的对图片进行Base64转码和解码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。