exp: C语言写的, 比较冗长.
#include <stdio.h>
int decode_4(int a)
{
int i = 0, j = 0, temp = 0;
for(i = 0; i < 2000; i++)
{
j = i;
j ^= 10;
temp = (16*j >> 31)>>28;
if(a == j + (((temp + 16*(*(char *)&j))&0xF)-temp))
break;
}
return i;
}
int main(void)
{
union
{
unsigned char ida_chars[152];
int a[37];
}A = {
66, 0, 0, 0, 74, 0, 0, 0, 68, 0,
0, 0, 123, 0, 0, 0, 51, 0, 0, 0,
112, 3, 0, 0, 70, 0, 0, 0, 212, 0,
0, 0, 60, 0, 0, 0, 16, 6, 0, 0,
79, 0, 0, 0, 200, 0, 0, 0, 108, 0,
0, 0, 32, 3, 0, 0, 30, 0, 0, 0,
144, 1, 0, 0, 111, 0, 0, 0, 48, 6,
0, 0, 70, 0, 0, 0, 144, 1, 0, 0,
59, 0, 0, 0, 16, 6, 0, 0, 29, 0,
0, 0, 196, 0, 0, 0, 62, 0, 0, 0,
96, 6, 0, 0, 75, 0, 0, 0, 208, 0,
0, 0, 108, 0, 0, 0, 16, 3, 0, 0,
70, 0, 0, 0, 136, 1, 0, 0, 51, 0,
0, 0, 112, 3, 0, 0, 76, 0, 0, 0,
204, 0, 0, 0, 125, 0, 0, 0, 0, 0,
0, 0
};
int i = 0, j = 36, temp = 0;
int d[100] = {0}, e[100] = {0};
int a1[100] = {3,6,5,4,5,11,1,7,9,5,3,6,10,9,5,4,11,1,6,3,7,9,10,9,5,4,14,1,7,9,10,9,4,5,3,6,1,5,3,6,7,9,10,9,36,3,6,36,4,1,5,7,9,3,6,5,10,9,4,1,7,9,10,9,5,4,5,1,5,7,9,5,10,9,3,6,5,4,5,11,1,7,9,5,3,6,10,9};
int b[100] = {1,2,3,4,19,31,25,14,23,33,13,9,24,6,26,34,17,10,8,29,12,15,22,11,18,16,32,28,21,36,20,7,5,27,30,35,37};
int c[100] = {1,2,3,4,31,29,7,35,14,21,9,16,27,18,25,10,20,15,17,22,28,26,36,33,32,5,8,12,23,34,13,30,24,11,19,6,37};
while(i >= -87)
switch(a1[87+i])
{
case 1:
--j;
--i;
A.a[j] = (A.a[j] / 16)*2;
A.a[j] = A.a[j];
A.a[j] /= 2;
break;
case 2:
A.a[j] -= 128;
A.a[j] = A.a[j]*j;
--i;
break;
case 3:
A.a[++j] /= 10;
--i;
break;
case 4:
--j;
--i;
A.a[j] = decode_4(A.a[j]);
break;
case 5:
A.a[j] = A.a[j];
--i;
break;
case 6:
A.a[j--] *= 10;
--i;
break;
case 7:
A.a[j] -= 128;
A.a[j] = ~A.a[j];
--i;
break;
case 9:
--i;
--j;
break;
case 10:
A.a[j] /= 4;
--i;
break;
default:
--i;
break;
}
for(i = 0; i < 37; i++)
{
d[c[i]-1] = A.a[i];
}
for(i = 0; i < 37; i++)
{
e[b[i]-1] = d[i];
}
for(i = 4; i <= 19; i++)
{
temp = e[i];
e[i] = e[i+16];
e[i+16] = temp;
}
for(i = 0; i < 37; i++)
printf("%c", e[i]);
return 0;
}