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_encodeconst unsigned char* bindata, char* base64, int binlength); // base64编码字符串 bindata 解码后buffer int base64_decodeconst 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; } //获取图片大小 fseekfp, 0L, SEEK_END); imageSize = ftellfp); fseekfp, 0L, SEEK_SET); //分配内存存储整个图片 imageBin = char*)mallocsizeofchar) * imageSize); if NULL == imageBin) { printf"malloc failed"); return -1; } //读取图片 result = freadimageBin, 1, imageSize, fp); if result != imageSize) { printf"file read failed"); return -1; } fclosefp); //分配编码后图片所在buffer imageBase64 = char*)mallocsizeofchar) * imageSize * 2);//因为编码一版会比源数据大1/3的样子,这里直接申请源文件一倍的空间 if NULL == imageBase64) { printf"malloc failed"); return -1; } //base64编码 base64_encodeimageBin, imageBase64, imageSize); base64StrLength = strlenimageBase64); printf"base64 str length:%d ", base64StrLength); printf"将图片读入out.txt中 "); //分配存储解码数据buffer imageOutput = char*)mallocsizeofchar) * imageSize);//解码后应该和源图片大小一致 if NULL == imageBase64) { printf"malloc failed"); return -1; } base64_decodeimageBase64, imageOutput); fp = fopen"output.bmp", "wb"); if NULL == fp) { printf"file open file"); return -1; } fwriteimageOutput, 1, imageSize, fp); fclosefp); freeimageBin); freeimageBase64); freeimageOutput); return 0; } const char* base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* base64_encodeconst 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_decodeconst char* base64, unsigned char* bindata) { int i, j; unsigned char k; unsigned char temp[4]; for i = 0, j = 0; base64[i] != ''; i += 4) { memsettemp, 0xFF, sizeoftemp)); 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_encodeconst unsigned char* bindata, char* base64, int binlength); // base64编码字符串 bindata 解码后buffer int base64_decodeconst 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; } //获取图片大小 fseekfp, 0L, SEEK_END); imageSize = ftellfp); fseekfp, 0L, SEEK_SET); //分配内存存储整个图片 imageBin = char*)mallocsizeofchar) * imageSize); if NULL == imageBin) { printf"malloc failed"); return -1; } //读取图片 result = freadimageBin, 1, imageSize, fp); if result != imageSize) { printf"file read failed"); return -1; } fclosefp); //分配编码后图片所在buffer imageBase64 = char*)mallocsizeofchar) * imageSize * 2);//因为编码一版会比源数据大1/3的样子,这里直接申请源文件一倍的空间 if NULL == imageBase64) { printf"malloc failed"); return -1; } //base64编码 base64_encodeimageBin, imageBase64, imageSize); base64StrLength = strlenimageBase64); printf"base64 str length:%d ", base64StrLength); printf"将图片读入out.txt中 "); FILE* file = fopen"out.txt", "wb"); if file == NULL) { printf"Error!"); exit1); } //将Base64编码写入文件 int i = 0; while imageBase64[i] != NULL) { fputcimageBase64[i++], file); } fclosefile); //分配存储解码数据buffer imageOutput = char*)mallocsizeofchar) * imageSize);//解码后应该和源图片大小一致 if NULL == imageBase64) { printf"malloc failed"); return -1; } base64_decodeimageBase64, imageOutput); fp = fopen"output.bmp", "wb"); if NULL == fp) { printf"file open file"); return -1; } fwriteimageOutput, 1, imageSize, fp); fclosefp); freeimageBin); freeimageBase64); freeimageOutput); return 0; } const char* base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* base64_encodeconst 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_decodeconst char* base64, unsigned char* bindata) { int i, j; unsigned char k; unsigned char temp[4]; for i = 0, j = 0; base64[i] != ''; i += 4) { memsettemp, 0xFF, sizeoftemp)); 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; }