什么是Base64?
引用
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
具体的见压缩包吧!
VC的实现是我修改过的,调用方法见头文件:Base64.h
/*************************************************************
* $Id: base64.c,v 1.2 2004/02/04 02:17:32 hno Exp $
* 2009/03/22 iawen修正了对中文支持的一些BUG
使用示例[VC]:
1、获取需要加密的字符串:
char srcString[BASE64_RESULT_SZ];
memset(srcString,0,BASE64_RESULT_SZN);
GetDlgItemText(hDlg,IDC_SRC,srcString,BASE64_RESULT_SZ-1);
2、调用相应函数,并接收返回的值:
char destString[BASE64_RESULT_SZ];
memset(destString,0,BASE64_RESULT_SZ);
Base64Init();
Base64Encode(srcString,destString);
SetDlgItemText(hDlg,IDC_DEST,destString);
**************************************************************/
#define __IAWEN_BASE64_H__
#ifdef __IAWEN_BASE64_H__
#define BASE64_VALUE_SZ 256
#define BASE64_RESULT_SZ 8192
extern
char base64_code
[
]
;
void Base64Init
(
)
;
//初始化设置
void Base64Decode
(
const
char
*srcString
,
char
*destString
)
;
//对字符串进行解密
// srcString: 指向需要加密的字符串
// destString: 保存加密后的字符串,用以返回
void Base64Encode
(
const
char
*srcString
,
char
*destString
)
;
//对字符串进行加密
// srcString: 指向加密后的字符串
// destString: 保存解密后的字符串,用以返回
#endif
Base64.cpp的具体代码也如下:
/*
* $Id: base64.c,v 1.2 2004/02/04 02:17:32 hno Exp $
* 2009/03/22 iawen修正了对中文支持的一些BUG
*/
#include <stdlib.h>
#include"Base64.h"
int base64_value
[BASE64_VALUE_SZ
]
;
char base64_code
[
]
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
;
void Base64Init
(
)
{
int i
;
for
(i
=
0
; i
< BASE64_VALUE_SZ
; i
++
)
base64_value
[i
]
=
-
1
;
for
(i
=
0
; i
<
64
; i
++
)
base64_value
[
(
int
) base64_code
[i
]
]
= i
;
base64_value
[
'='
]
=
0
;
}
void Base64Decode
(
const
char
*srcString
,
char
*destString
)
{
int j
;
int c
;
long val
;
if
(
!srcString
)
return
;
val
= c
=
0
;
for
(j
=
0
;
*srcString
&& j
+
4
< BASE64_RESULT_SZ
; srcString
++
)
{
unsigned
char ch
=
(
(
unsigned
char
)
*srcString
)
;
if
(ch
==
'/'
)
//修正部分一:当加密字符为'/'时,替换值为0
ch
=
0
;
unsigned
int k
= ch
% BASE64_VALUE_SZ
;
if
(base64_value
[k
]
<
0
)
continue
;
val
<<=
6
;
val
+= base64_value
[k
]
;
if
(
++c
<
4
)
continue
;
/* One quantum of four encoding characters/24 bit */
destString
[j
++
]
=
(val
>>
16
)
&
0xff
;
/* High 8 bits */
destString
[j
++
]
=
(val
>>
8
)
&
0xff
;
/* Mid 8 bits */
destString
[j
++
]
= val
&
0xff
;
/* Low 8 bits */
val
= c
=
0
;
}
destString
[j
]
=
0
;
return
;
}
/* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
void Base64Encode
(
const
char
*srcString
,
char
*destString
)
{
int bits
=
0
;
int char_count
=
0
;
int out_cnt
=
0
;
int c
;
if
(
!srcString
)
return
;
while
(
(c
=
(
unsigned
char
)
*srcString
++
)
&& out_cnt
<
sizeof
(destString
)
-
5
)
{
bits
+= c
;
char_count
++;
if
(char_count
==
3
)
{
//修正部分二:当操作结果为0时,用'/'替换
char tmp
=base64_code
[bits
>>
18
]
;
if
(tmp
==
0
)
destString
[out_cnt
++
]
=
'/'
;
else
destString
[out_cnt
++
]
=tmp
;
tmp
=base64_code
[
(bits
>>
12
)
&
0x3f
]
;
if
(tmp
==
0
)
destString
[out_cnt
++
]
=
'/'
;
else
destString
[out_cnt
++
]
=tmp
;
tmp
=base64_code
[
(bits
>>
6
)
&
0x3f
]
;
if
(tmp
==
0
)
destString
[out_cnt
++
]
=
'/'
;
else
destString
[out_cnt
++
]
=tmp
;
tmp
=base64_code
[bits
&
0x3f
]
;
if
(tmp
==
0
)
destString
[out_cnt
++
]
=
'/'
;
else
destString
[out_cnt
++
]
=tmp
;
bits
=
0
;
char_count
=
0
;
}
else
{
bits
<<=
8
;
}
}
if
(char_count
!=
0
)
{
bits
<<=
16
-
(
8
* char_count
)
;
destString
[out_cnt
++
]
= base64_code
[bits
>>
18
]
;
destString
[out_cnt
++
]
= base64_code
[
(bits
>>
12
)
&
0x3f
]
;
if
(char_count
==
1
)
{
destString
[out_cnt
++
]
=
'='
;
destString
[out_cnt
++
]
=
'='
;
}
else
{
destString
[out_cnt
++
]
= base64_code
[
(bits
>>
6
)
&
0x3f
]
;
destString
[out_cnt
++
]
=
'='
;
}
}
destString
[out_cnt
]
=
'/0'
;
/* terminate */
return
;
}
在使用时,只需要包含:base64.h这个头文件,就可以如示例般调用了!
ASM的实现是网上收集的,大家自己看吧,没有具体测试过。
这里将这些放在一起,是方便自己的查找与整理!
下载文件 (已下载 149 次)
点击这里下载文件: Base64_Src.rar
转帖地址:
http://www.iawen.com/read.php/235.htm