#include <stdio.h>
#include <ctype.h>
unsigned char *foo(unsigned char *dst, const unsigned char *src)
{
static const unsigned char nibble[] =
{
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
};
unsigned char *start = dst;
while ( *src )
{
*dst++ = nibble [ *src >> 4 ];
*dst++ = nibble [ *src++ & 0xF ];
}
*dst = '\0';
return start;
}
unsigned char *bar(unsigned char *dst, const unsigned char *src)
{
unsigned char *start = dst;
while ( *src )
{
if ( isdigit(*src) )
{
*dst = *src++ - '0';
}
else
{
*dst = *src++ - 'A' + 10;
}
*dst <<= 4;
if ( isdigit(*src) )
{
*dst++ += *src++ - '0';
}
else
{
*dst++ += *src++ - 'A' + 10;
}
}
*dst = '\0';
return start;
}
int main(void)
{
const unsigned char abc[] = "ABCMNO";
unsigned char over [ sizeof abc * 2 - 1 ], back [ sizeof abc ];
printf("\"%s\" -> \"%s\"\n", abc, foo(over, abc));
printf("\"%s\" -> \"%s\"\n", over, bar(back, over));
return 0;
}
/* my output
"ABCMNO" -> "4142434D4E4F"
"4142434D4E4F" -> "ABCMNO"
*/