Base 64 인 코딩 의 C 언어 구현

6374 단어 프로 그래 밍
본문http://blog.163.com/lixiangqiu_9202/blog/static/5357503720140593058179/
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

좋은 웹페이지 즐겨찾기