base64 編碼長度是 ceil(n/3) * 4 n是原始資料長度
base64 解碼長度怎么算?
uj5u.com熱心網友回復:
因為base64存在補=號,所以算出來的只是一個范圍,長度*3/4+1最大長度,如果要具體算出來編碼之前的長度,需要自行判斷補=號情況減去對應的占位uj5u.com熱心網友回復:
僅供參考:#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BASE64_VALUE_SZ 256
int base64_value[BASE64_VALUE_SZ];
const unsigned char alphabet[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
class Base64Utility {
public:
Base64Utility();
int base64_encode(char *src, int srclen, char *dst, int tail);
int base64_decode(char *src, int srclen, char *dst);
private:
void base_64_init(void);
};
Base64Utility::Base64Utility() {
base_64_init();
}
void Base64Utility::base_64_init(void) {
int i;
for (i = 0; i < BASE64_VALUE_SZ; i++) base64_value[i] = -1;
for (i = 0; i < 64; i++) base64_value[(int) alphabet[i]] = i;
base64_value['='] = 0;
}
int Base64Utility::base64_encode(char *src, int srclen, char *dst, int tail) {
int bits, char_count, len;
char *o_char, *lim, *o_lim;
unsigned char c;
if ( !src || !dst) return 0;
len = srclen;
lim = src + len;
o_char = dst;
o_lim = dst + (len*4)/3 + 1;
char_count = 0;
bits = 0;
while ( (src < lim) && (o_char < o_lim)) {
c = *(src++);
bits += c;
char_count++;
if (char_count == 3) {
*(o_char++) = alphabet[bits >> 18];
*(o_char++) = alphabet[(bits >> 12) & 0x3f];
*(o_char++) = alphabet[(bits >> 6) & 0x3f];
*(o_char++) = alphabet[bits & 0x3f];
bits = 0;
char_count = 0;
} else {
bits <<= 8;
}
}
if (char_count != 0) {
bits <<= 16 - (8 * char_count);
*(o_char++) = alphabet[bits >> 18];
*(o_char++) = alphabet[(bits >> 12) & 0x3f];
if (char_count == 1) {
if (tail) {
*(o_char++) = '=';
*(o_char++) = '=';
}
} else {
*(o_char++) = alphabet[(bits >> 6) & 0x3f];
if (tail) {
*(o_char++) = '=';
}
}
}
*(o_char) = 0;
return strlen(dst);
}
int Base64Utility::base64_decode(char *src, int srclen, char *dst) {
int j;
unsigned int k;
int c, base_result_sz;
long val;
if (!src || !dst) return 0;
base_result_sz = srclen;
val = c = 0;
for (j = 0; *src; src++) {
k = (int) *src % BASE64_VALUE_SZ;
if (base64_value[k] < 0) continue;
val <<= 6;
val += base64_value[k];
if (++c < 4) continue;
dst[j++] = (char) (val >> 16);
dst[j++] = (val >> 8) & 0xff;
dst[j++] = val & 0xff;
val = c = 0;
}
switch (c) {
case 2://xxxxxx xx0000
dst[j++] = (val >> 4) & 0xff;
break;
case 3://XXXXXX XXxxxx xxxx00
dst[j++] = (char) (val >> 10);
dst[j++] = (val >> 2) & 0xff;
break;
}
return j;
}
Base64Utility b64u;
#define MAXLENS 1024768
#define MAXLEND 1366360
char bufd[MAXLEND];
char bufs[MAXLENS];
FILE *fs,*fd;
int fsize;
int main(int argc,char *argv[]) {
if (argc<4) {
USE:
printf("%s <-e|-E|-d> srcfile desfile\n",argv[0]);
return 1;
}
if (stricmp(argv[1],"-e") && stricmp(argv[1],"-d")) goto USE;
if (0==stricmp(argv[1],"-e")) {
fs=fopen(argv[2],"rb");
if (NULL==fs) {
printf("Can not open file %s!\n",argv[2]);
return 2;
}
fsize=fread(bufs,1,MAXLENS,fs);
if (fsize<=0) {
fclose(fs);
printf("Can not read file %s!\n",argv[2]);
return 3;
}
if (MAXLENS==fsize) printf("Warning: Up to %d bytes.\n",MAXLENS);
fclose(fs);
b64u.base64_encode(bufs,fsize,bufd,('E'==argv[2][1]));
fd=fopen(argv[3],"w");
if (NULL==fd) {
printf("Can not create file %s!\n",argv[3]);
return 4;
}
fprintf(fd,"%s",bufd);
fclose(fd);
} else {//0==stricmp(argv[1],"-d")
fd=fopen(argv[2],"rb");
if (NULL==fd) {
printf("Can not open file %s!\n",argv[2]);
return 2;
}
fsize=fread(bufd,1,MAXLEND,fd);
if (fsize<=0) {
fclose(fd);
printf("Can not read file %s!\n",argv[2]);
return 3;
}
if (MAXLEND==fsize) printf("Warning: Up to %d bytes.\n",MAXLEND);
fclose(fd);
fsize=b64u.base64_decode(bufd,fsize,bufs);
fs=fopen(argv[3],"wb");
if (NULL==fs) {
printf("Can not create file %s!\n",argv[3]);
return 4;
}
if (fsize!=(int)fwrite(bufs,1,fsize,fs)) {
printf("Write %s error!\n",argv[3]);
fclose(fs);
return 5;
}
fclose(fs);
}
return 0;
}
uj5u.com熱心網友回復:
假設編碼之后的字符數是L,那么解碼長度:n = L/4*3 +(3&(L-1))%3
不管BASE64文本的后面是否補了=,上面的計算結果肯定是“原始長度”n。

uj5u.com熱心網友回復:
另外: 如果BASE64文本的編碼長度為L如果: 3 & L ==1
那么: 編碼長度不合法!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284878.html
標籤:C語言
上一篇:補全程式
下一篇:去除重復值