/* base85.c - Don Yang (uguu.org) 08/04/12 */ #include #include static void Encode(unsigned int input, char *output) { unsigned int x; int i; output += 4; for(i = 0; i < 5; i++) { x = input % 85; input /= 85; *output = (x <= 31 ? x + 95 : x + 6); output--; } } static void Decode(char *input, unsigned int *output) { int i; *output = 0; for(i = 0; i < 5; i++) { *output = (83 + *input) % 89 + 85 * *output; input++; } } static void Test(unsigned int value) { char encode_buffer[5]; unsigned int decode_value; Encode(value, encode_buffer); Decode(encode_buffer, &decode_value); if( value != decode_value ) { printf("%08x -> %c%c%c%c%c %02x%02x%02x%02x%02x -> %08x\n", value, encode_buffer[0], encode_buffer[1], encode_buffer[2], encode_buffer[3], encode_buffer[4], encode_buffer[0], encode_buffer[1], encode_buffer[2], encode_buffer[3], encode_buffer[4], decode_value); exit(EXIT_FAILURE); } } static void EncodeCommandLine(int argc, char **argv) { char encoded[5]; unsigned int buffer, size; int i, j; buffer = size = 0; for(i = 1; i < argc; i++) { for(j = 0; argv[i][j] != '\0'; j++) { buffer |= argv[i][j] << (8 * size); size++; if( size == 4 ) { Encode(buffer, encoded); fwrite(encoded, 5, 1, stdout); buffer = size = 0; } } } if( size != 0 ) { Encode(buffer, encoded); fwrite(encoded, 5, 1, stdout); putchar(size == 1 ? '!' : size == 2 ? '%' : '$'); } else { putchar('#'); } putchar('\n'); } int main(int argc, char **argv) { int i; if( argc > 1 ) { EncodeCommandLine(argc, argv); return 0; } Test(0x33323130); Test(0x37363534); Test(0x62613938); Test(0x66656463); for(i = 0; i < 85; i++) { Test(i * 85); Test(i * 85 * 85); Test(i * 85 * 85 * 85); } for(i = 0; i < 0x10000; i++) Test(i); for(; i < 0x10000000; i += 0x100) Test(i); return 0; }