Base 64 인 코딩 의 C 언어 구현
6374 단어 프로 그래 밍
Bse 64 는 바 이 너 리 데 이 터 를 인쇄 가능 한 64 개의 문자 로 인 코딩 하 는 인 코딩 알고리즘 이다.base 64 는 데 이 터 를 인 코딩 할 때 8 자리 문자 형 데 이 터 를 3 개 로 한 그룹 으로 하고 이 세 글자 형 데이터 의 ASCII 코드 를 취한 다음 6 자리 로 한 그룹 으로 4 개의 새로운 데 이 터 를 구성 합 니 다.이 4 개의 새로운 데 이 터 는 6 자리 이기 때문에 최대 값 은 2^6=64 입 니 다.우 리 는 베이스 64 표 에서 최종 인 코딩 된 문 자 를 4 개의 6 비트 데이터 의 10 진수 로 얻 었 다.
Base 64 인 코딩 테이블
Value
Char
Value
Char
Value
Char
Value
Char
0
A
16
Q
32
g
48
w
1
B
17
R
33
h
49
x
2
C
18
S
34
i
50
y
3
D
19
T
35
j
51
z
4
E
20
U
36
k
52
0
5
F
21
V
37
l
53
1
6
G
22
W
38
m
54
2
7
H
23
X
39
n
55
3
8
I
24
Y
40
o
56
4
9
J
25
Z
41
p
57
5
10
K
26
a
42
q
58
6
11
L
27
b
43
r
59
7
12
M
28
c
44
s
60
8
13
N
29
d
45
t
61
9
14
O
30
e
46
u
62
+
15
P
31
f
47
v
63
/
base 64 인 코딩 은 인 코딩 전의 3*8 비트 데 이 터 를 4 개의 6 비트 데이터 로 분해 하기 때문에 base 64 인 코딩 을 거 친 문자열 의 길 이 는 4 의 배수 입 니 다.그러나 흔히 우리 가 인 코딩 을 하 는 데이터 길 이 는 3 의 배수 가 아니 기 때문에'인 코딩'후의 자릿수 는 4 의 배수 가 아니다.예 를 들 어 Brisk 는 모두 5 이다.×8=40 비트,6 비트 를 한 그룹 으로 나 눌 수 있 습 니 다.이렇게'인 코딩'하면 7 글자 가 있 습 니 다.그러나 base 64 인 코딩 후의 문자 길 이 는 4 의 배수 여야 합 니 다.여기 서 문제 가 생 긴 것 이 분명 합 니 다.그러면 어떻게 해 야 합 니까?앞 에 있 는 것 은 버 릴 수 없 기 때문에'추가'만 있 습 니 다.그래서 Brisk 는 base 64 인 코딩 을 거 친 후의 길 이 는 8 글자 여야 합 니 다.8 번 째 인 코딩 후의 문 자 는'='입 니 다.예 를 들 어 하나의 문자 a 에 대해 base 64 인 코딩 을 합 니 다.그 길 이 는 3 의 배수 가 아니 기 때문에 3 개의 바이트 로 한 그룹 으로 나 눌 수 있 습 니 다.6 자 리 를 한 자리 로 두 그룹 으로 나 눌 수 있 습 니 다.그래서'인 코딩'을 거 친 후에 그 길 이 는 2 이지 만 base 64 인 코딩 후의 개 수 는 4 의 배수 가 되 어야 하기 때문에 그 길 이 는 4 가 되 어야 한다.그래서 뒤에 두 개의'='을 채 워 야 한다.한 개의 수가 3 을 구 한 후에 세 개의 다른 결과 가 있 기 때문에 0,1,2 가 있 기 때문에 한 데이터 에 대해 base 64 를 인 코딩 한 후에 그 길 이 는 다음 과 같다.
(1)인 코딩 된 데이터 길이 가 3 의 배수 일 때 len=strlen(strin)/3*4; (2)인 코딩 된 데이터 길이 가 3 의 배수 가 아 닐 때 len=(strlen(strin)/3+1)*4;
우 리 는 Brisk 라 는 예 로 base 64 인 코딩 과정 을 설명 합 니 다.우선 우 리 는 3 자 를 한 조로 나 누 어 Brisk 를 그룹 으로 나 누 었 습 니 다.Brisk 는 분위기 에 의 해 두 그룹 으로 나 뉘 었 습 니 다.Bri 와 sk;그리고 우 리 는 이 두 그룹 에서 각 바이트 의 ASCII 코드 를 꺼 냈 다.B:66 r:114 i:105 s:115 k:107.그것들 에 대응 하 는 이 진수 는 B:01000010 r:01110010 i:01101001 s:01110011 k:01101011;
첫 번 째 조,우 리 는 6 명 을 한 조로 하여 각 3 바이트 에 대해 조 를 나 누 면 010000 100111 001101001 이 된다.대응 하 는 10 진수 는 16,39,9,41 이 며,대응 하 는 base 64 표 의 결 과 는? Q n J p;
2 조,011100 110110 101100(보충 0 부족)이 므 로 대응 하 는 10 진수 는 28 54 44,대응 base 64 표 의 결 과 는? c2s,최종 결 과 는 QnJpc2s=(두 번 째 그룹 인 코딩 후 세 바이트 만 있 기 때 문).
디 코딩 과정 은 역 과정 입 니 다.우 리 는 인 코딩 을 거 친 문 자 를 4 글자 로 한 그룹 으로 한 다음 에 base 64 표 와 대조 하여 해당 하 는 10 진수 를 얻 은 다음 에 이 를 분할 과 조합 을 통 해 8 비트 데 이 터 를 구성 할 것 입 니 다.이 데 이 터 는 디 코딩 후의 데이터 입 니 다.다음은 c 언어 에 인 코딩 과 디 코딩 을 실현 하 는 코드 입 니 다.
/*base64.h*/
#ifndef _BASE64_H
#define _BASE64_H
#include
#include
unsigned char *base64_encode(unsigned char *str);
unsigned char *bae64_decode(unsigned char *code);
#endif
/*base64.c*/
#include "base64.h"
unsigned char *base64_encode(unsigned char *str)
{
long len;
long str_len;
unsigned char *res;
int i,j;
// base64
unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// base64
str_len=strlen(str);
if(str_len % 3 == 0)
len=str_len/3*4;
else
len=(str_len/3+1)*4;
res=malloc(sizeof(unsigned char)*len+1);
res[len]='\0';
// 3 8
for(i=0,j=0;i>2]; // 6
res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)]; // 4
res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)]; // 4 2
res[i+3]=base64_table[str[j+2]&0x3f]; // 6
}
switch(str_len % 3)
{
case 1:
res[i-2]='=';
res[i-1]='=';
break;
case 2:
res[i-1]='=';
break;
}
return res;
}
unsigned char *base64_decode(unsigned char *code)
{
// base64 ,
int table[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
long len;
long str_len;
unsigned char *res;
int i,j;
//
len=strlen(code);
// =
if(strstr(code,"=="))
str_len=len/4*3-2;
else if(strstr(code,"="))
str_len=len/4*3-1;
else
str_len=len/4;
res=malloc(sizeof(unsigned char)*str_len+1);
res[str_len]='\0';
// 4
for(i=0,j=0;i < len-2;j+=3,i+=4)
{
res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4); // base64 6 base64 2
res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2); // base64 4 bas464 4
res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]); // base64 2 4
}
return res;
}
/* */
#include "base64.h"
#include
int main(int argc,char **argv)
{
if(strcmp(argv[1],"-d") == 0)
printf("%s
",base64_decode(argv[2]));
else
printf("%s
",base64_encode(argv[1]));
return 0;
}
gcc -o test test.c base64.c
./test Brisk
QnJpc2s=
./test -d QnJpc2s=
Brisk
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.