URL Decoder and Encoder
Here are some simple C-based filter programs to decode and encode URL-encoded hex characters.
The "decoder", detects and decodes any URL-encoded characters in the stream:
#include <stdio.h>
static int from_hex(char c)
{
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return c - 0x30;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
return c - 55;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
return c - 87;
}
return 0;
}
int main(void)
{
int c, in_code, first_hex;
in_code = 0;
while ((c = fgetc(stdin)) != EOF) {
if (in_code == 1) {
first_hex = from_hex(c);
in_code++;
} else if (in_code == 2) {
fputc(from_hex(c) + (first_hex * 16), stdout);
in_code = 0;
} else {
if (c == '%') {
in_code = 1;
} else {
fputc(c, stdout);
}
}
}
return 0;
}
The "encoder", simply encodes every character into the URL-encoded counter-part:
#include <stdio.h>
static char to_hex(int n)
{
switch (n) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
return n + 0x30;
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
return n + 55;
}
return '?';
}
int main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF) {
fputc('%', stdout);
fputc(to_hex(c / 16), stdout);
fputc(to_hex(c % 16), stdout);
}
return 0;
}