Base-64编码及Perl实现

时间:2021-11-09 18:31:30

2012-11-04 wcdj

Base-64编码

Base-64编码可以将任意一组字节转换成较长的(扩大了33%)常见文本字符序列,从而可以合法地作为HTTP首部字段值。即,Base-64编码将用户输入或二进制数据打包成一种安全的格式,将其作为HTTP首部字段的值发送出去,而无须担心其中包含会破坏HTTP分析程序的冒号、换行符或二进制值。

8位到6位

Base-64编码将一个8位字节拆分为6位的片段,并为每个6位的片段分配一个字符(Base-64字母表中的64个字符之一,0~63),这64个字符中包含26个大写字母、26个小写字母、10个数字、‘+’和‘/’2个字符,共64个字符,另外还使用了特殊字符‘=’。

Base-64填充

Base-64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。但二进制序列有时不能正好平均地分成6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(即,6和8的最小公倍数)。

对已填充的二进制串进行编码时,任何完全填充(不包含原始数据中的位)的6位组都由特殊的第65个符号‘=’表示;如果6位组是部分填充的,就将填充的位设置为0。

  • 编码「Man」
文本 M a n
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

在此例中,Base64算法将三个字符编码为4个字符


Base64索引表:

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 /

Perl实现

MIME::Base64是Perl中的Base-64编/解码模块。

#!/usr/bin/perl

use MIME::Base64;

printf("orignal string is 'Man'\n");
$encoded = encode_base64('Man');
printf("after base64 encoded is: %s", $encoded);
$decoded = decode_base64($encoded);
printf("after base64 decoded is: %s\n\n", $decoded);


printf("\nencode_base64\n");

# YTph
$encoded1 = encode_base64('a:a');
print $encoded1;

# YTphYQ==
$encoded2 = encode_base64('a:aa');
print $encoded2;

# YTphYWE=
$encoded3 = encode_base64('a:aaa');
print $encoded3;

# YTphYWFh
$encoded4 = encode_base64('a:aaaa');
print $encoded4;

printf("\ndecode_base64\n");

$decoded1 = decode_base64($encoded1);
print $decoded1 ."\n";

$decoded2 = decode_base64($encoded2);
print $decoded2 ."\n";

$decoded3 = decode_base64($encoded3);
print $decoded3 ."\n";

$decoded4 = decode_base64($encoded4);
print $decoded4 ."\n";

system(pause);


 

参考:

http://zh.wikipedia.org/wiki/Base64