parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ну вот и пригодилось ;-)

Luzhnikovskiy 13.08.2003 15:46

BASE64. Единственное ограничение - в пароле разрешены не все символы (см. словарик $bits)
@base64[text][bits;uue;bitSequence;3bytes;sixtet;out;fin;i;j]
###########################################################
#<!-- таблица соответствия символов их ASCII-кодам в битовом представлении -->
$bits[^table::create{from	to
!	00100001
^$	00100100
%	00100101
&	00100110
'	00100111
(	00101000
)	00101001
*	00101010
+	00101011
,	00101100
-	00101101
.	00101110
/	00101111
0	00110000
1	00110001
2	00110010
3	00110011
4	00110100
5	00110101
6	00110110
7	00110111
8	00111000
9	00111001
:	00111010
^;	00111011
<	00111100
=	00111101
>	00111110
?	00111111
^taint[as-is][@]	01000000
A	01000001
B	01000010
C	01000011
D	01000100
E	01000101
F	01000110
G	01000111
H	01001000
I	01001001
J	01001010
K	01001011
L	01001100
M	01001101
N	01001110
O	01001111
P	01010000
Q	01010001
R	01010010
S	01010011
T	01010100
U	01010101
V	01010110
W	01010111
X	01011000
Y	01011001
Z	01011010
[	01011011
\	01011100
]	01011101
^^	01011110
_	01011111
`	01100000
a	01100001
b	01100010
c	01100011
d	01100100
e	01100101
f	01100110
g	01100111
h	01101000
i	01101001
j	01101010
k	01101011
l	01101100
m	01101101
n	01101110
o	01101111
p	01110000
q	01110001
r	01110010
s	01110011
t	01110100
u	01110101
v	01110110
w	01110111
x	01111000
y	01111001
z	01111010
{	01111011
|	01111100
}	01111101
~	01111110}]

#<!-- таблица соответствия битовых сикстетов UU-кодам -->
$uue[^hash::create[]]
$uue[
	$.000000[A]
	$.000001[B]
	$.000010[C]
	$.000011[D]
	$.000100[E]
	$.000101[F]
	$.000110[G]
	$.000111[H]
	$.001000[I]
	$.001001[J]
	$.001010[K]
	$.001011[L]
	$.001100[M]
	$.001101[N]
	$.001110[O]
	$.001111[P]
	$.010000[Q]
	$.010001[R]
	$.010010[S]
	$.010011[T]
	$.010100[U]
	$.010101[V]
	$.010110[W]
	$.010111[X]
	$.011000[Y]
	$.011001[Z]
	$.011010[a]
	$.011011[b]
	$.011100[c]
	$.011101[d]
	$.011110[e]
	$.011111[f]
	$.100000[g]
	$.100001[h]
	$.100010[i]
	$.100011[j]
	$.100100[k]
	$.100101[l]
	$.100110[m]
	$.100111[n]
	$.101000[o]
	$.101001[p]
	$.101010[q]
	$.101011[r]
	$.101100[s]
	$.101101[t]
	$.101110[u]
	$.101111[v]
	$.110000[w]
	$.110001[x]
	$.110010[y]
	$.110011[z]
	$.110100[0]
	$.110101[1]
	$.110110[2]
	$.110111[3]
	$.111000[4]
	$.111001[5]
	$.111010[6]
	$.111011[7]
	$.111100[8]
	$.111101[9]
	$.111110[+]
	$.111111[/]
]
#<!-- переводим текст на входе в битовое представление -->
$bitSequence[^text.replace[$bits]]
#<!-- для каждых трех байт -->
^for[i](0;^math:floor(^bitSequence.length[]/24)){
#<!-- вырезаем из строки битов 24 штуки -->
	$3bytes[^bitSequence.mid($i*24;24)]
#<!-- проверяем длину и добиваем нулями для кратности 6 -->
#<!-- нужно исключительно для последних байт строки (остаток) -->
	^switch(^3bytes.length[]){
#<!-- длина = 1 байт. добавляем 4 нуля и "==" в качестве окончиния закодированной строки -->
		^case(8){
			$3bytes[${3bytes}0000]
			$fin[==]
#<!-- длина = 2 байта. добавляем 2 нуля и "=" в качестве окончиния закодированной строки -->
		}
		^case(16){
			$3bytes[${3bytes}00]$fin[=]
		}
#<!-- длина = 3 байта. ничего делать не надо. (исключительно для наглядности) -->
		^case(24){
		}
	}
#<!-- для каждых 6 бит -->
	^for[j](0;3){
#<!-- вырезаем из строки -->
		$sixtet[^3bytes.mid($j*6;6)]
#<!-- преобразуем и добавляем к результату -->
		$out[${out}$uue.[$sixtet]]
	}
}
#<!-- не забываем на выводе "хвостик" -->
$result[${out}$fin]

@main[]
###########################################################
<html>
<head>
	<title>Load</title>
</head>
<body>
	^try{
		$login[LOGIN]
		$passwd[PASSWD]
		$url[http://www.server.domain/file.ext]
		$f[^file::load[binary;$url][
			$.headers[
				$.Extension[Security/Remote-Passphrase]
				$.Authorization[Basic ^base64[${login}:$passwd]]
				$.User-Agent[me]
			]
		]]
		^taint[as-is][$f.text]
	}{
		$exception.handled(1)
		Не срослось...
	}
</body>
</html>