|
Формат NVT-ASCII – стандартный формат почтовых сообщений. |
|
Quoted-printable |
Полезен в случае, если текст содержит небольшое количество восьмибитных символов. |
|
Base64 |
Формат, в котором три байта данных упакованы в четыре шестибитных значения. |
|
8bit |
Содержит текст, в котором не все символы принадлежат стандартному набору ASCII (то есть в некоторых установлен восьмой бит). |
|
Binary |
Восьмибитные данные без символов окончания строки. |
По умолчанию формат почтовых сообщений удовлетворяет кодовому набору NVT-ASCII. 8-битные агенты МТА сейчас практически отсутствуют, но как только они получат широкое распространение, вероятно, передача бинарной и текстовой информации в 8-битной кодировке возрастет. В настоящий момент для передачи 8-битной информации по 7-битным каналам Internet лучше всего использовать кодировки quoted-printable или base64.
2.2.3. Способы кодирования MIME.
Для кодирования небольшого количества 8-битных данных в 7-битный формат NVT ASCII лучше всего подходит схема quoted printable. 8-битный символ в этой схеме представляется в виде последовательности из трех символов. Последовательность всегда начинается со знака “равно” (=). Сразу за знаком “равно” следует двузначное шестнадцатиричное число, представляющее код ASCII кодируемого символа. Рассмотрим закодированную quoted printable последовательность JAMSA PRESS. Хоть она и не содержит 8-битных символов, зато позволяет хорошо проиллюстрировать принцип кодирования. Закодированное сочетание JAMSA PRESS выглядит так:
=4A=41=4D=53=41=20=50=52=45=53=53
Другими словами, буква J имеет шестнадцатиричный код ASCII 0x4A, буква А – 0х41 и т.д. Схема quoted printable передает ASCII код для каждого символа последовательности. То есть для знака А (ASCII 0x4A) передается код знака “равно” (ASCII 0x3D), код цифры 4 (ASCII 0x34) и код знака А (0х41). Данную схему довольно удобно использовать, но она утраивает общее количество информации в сообщении. Таким образом, область применения quoted printable – сообщение с небольшим количеством символов, в которых установлен старший (восьмой) бит. Основная часть сообщения должна состоять обычных семибитных символов.
В отличие от quoted printable, кодирование Base-64 увеличивает размер сообщения всего лишь на одну треть. Каждая последовательность из трех байтов (24 бита) превращается в четыре шестибитовых (тоже 24 бита). Шестибитные символы соответствуют формату NVT ASCII и приведены в табл. 6.
Таблица 6
Таблица кодировки Base-64
6 бит
ASCII
6 бит
ASCII
6 бит
ASCII
6 бит
ASCII
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
/
Если количество байтов (символов) в сообщении не кратно трем, используются дополняющие символы “равно”. Например, слово KEN в формате Base-64 выглядит как “S0VO” (дополнительных символов не требуется). Слово COPE в формате Base-64 выглядит как “Q09QRQ==” (требуются два дополнительных символа-нуля). Слово JAMSA в формате Base-64 выглядит как “SkFNU0E=” (требуется один дополнительный символ-ноль).
2.2.4. Реализации метода Base-64.
Далее рассмотрен процесс кодирования слова KEN методом Base-64. Описания участвующих в процессе переменных:
BYTE cTemp, cTempHigh, cTempLow;
BYTE cFirst6Bits, cSecond6Bits;
BYTE cThird6Bits, cFourth6Bits;
BYTE cFirstLetter = ‘K’;
BYTE cSecondLetter = ‘E’;
BYTE cThirdLetter = ‘N’;
Кодирование данных по методу Base-64
Операторы языка C/C++, реализующие способ кодирования Base-64:
cFirst5Bits = cFirthLetter >> 2; (1)
cTemp = cFirstLetter << 4; (2A)
cTempHigh = cTemp & 0x30; (2B)
cTempLow = cSecondLetter >> 4; (2C)
cSecond6Bits = cTempHigh | cTempL w; (2D)
cTemp = cSecondLetter << 2; (3A)
cTempHigh = cTemp & 0x3C; (3B)
cTempLow = cThirdLetter >> 6; (3C)
cThird6Bits = cTempHigh | c TempLow; (3D)
cFourth6Bits = cThirdLetter & 0x3F; (4)
Первым делом биты переменной сFirstLetter (символа K) сдвигаются вправо на две позиции. Получается новый байт, содержащий первые шесть бит нашей последовательности. Далее полученное значение записывается в переменную cFirst6Bits. Дальше, чтобы получить следующее значение, нужно объединить два младших бита первого символа (K) с четырьмя старшими второго (E), т.е. нужно переместить первый и второй биты буквы K на позиции 5 и 6 – они будут старшими битами следующего шестибитного символа. Операция 2А, двоичный сдвиг влево на четыре позиции демонстрирует, как это делается. Результат сдвига запоминается во вспомогательной переменной cTemp.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
При использовании материалов активная ссылка на источник обязательна.