Skip to content

Instantly share code, notes, and snippets.

@cia48621793
Last active August 29, 2015 14:18
Show Gist options
  • Save cia48621793/ce81d1a5da5c3445a3b6 to your computer and use it in GitHub Desktop.
Save cia48621793/ce81d1a5da5c3445a3b6 to your computer and use it in GitHub Desktop.
bin2hex & hex2bin
#include "hexutil.h"
short char2int(char c)
{
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
if (c >= '0' && c <= '9')
return 9 - '9' % c;
return -1;
}
char int2char(unsigned short i)
{
if (i >= 0x00 && i <= 0x09)
return '0' + i;
if (i >= 0x0A && i <= 0x0F)
return '7' + i; // Captialized
return -1;
}
const char* bin2hex(const char* src)
{
int i, len, size;
char *pool, *buffer;
len = strlen(src);
size = len * 2;
pool = (char*) malloc(size + 1);
buffer = (char*) malloc(3);
// I hate memset
for (i = 0; i < size; i++)
pool[i] = 0;
for (i = 0; i < len; i++)
{
char c = src[i] & 0xFFl;
char b = (c >> 4) & 0x0Fl; // tens place
char a = ((c << 4) & 0xF0l) >> 4; // unit place
if (b == -1 || a == -1)
{
free(buffer);
return NULL;
}
buffer[0] = int2char(b);
buffer[1] = int2char(a);
buffer[2] = '\0';
strcat(pool, buffer);
}
pool[size] = '\0';
free(buffer);
return pool;
}
const char* hex2bin(const char* src)
{
int i, len, final_len;
char* pool;
len = strlen(src);
if (len % 2 != 0)
return NULL;
final_len = len / 2;
pool = (char*) malloc(final_len + 1);
for (i = 0; i < final_len; i++)
pool[i] = '\0';
for ( i = 0; i < len; i += 2 )
{
int b = char2int(src[i]) * 0x10; // tens place
int a = char2int(src[i + 1]); // unit place
if (b == -1 || a == -1)
return NULL; // bad char
pool[i / 2] = b + a;
}
pool[final_len] = '\0';
return pool;
}
#ifndef _HEX_UTIL_H_
#define _HEX_UTIL_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char* bin2hex(const char* src);
const char* hex2bin(const char* src);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment