Skip to content

Instantly share code, notes, and snippets.

@jige003
Created April 25, 2019 07:09
Show Gist options
  • Save jige003/cbba97e399d052f386c7287409b0df10 to your computer and use it in GitHub Desktop.
Save jige003/cbba97e399d052f386c7287409b0df10 to your computer and use it in GitHub Desktop.
c hex snippet
/*************************************************************************
> File Name: hex.c
> Author: jige003
> Created Time: Thu 25 Apr 2019 02:08:49 PM CST
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define P printf
size_t hexchr2bin(const char hex, char *out){
if (out == NULL)
return 0;
if (hex >= '0' && hex <= '9') {
*out = hex - '0';
} else if (hex >= 'A' && hex <= 'F') {
*out = hex - 'A' + 10;
} else if (hex >= 'a' && hex <= 'f') {
*out = hex - 'a' + 10;
} else {
return 0;
}
return 1;
}
size_t hexs2bin(const char *hex, unsigned char **out){
size_t len;
char b1;
char b2;
size_t i;
if (hex == NULL || *hex == '\0' || out == NULL)
return 0;
len = strlen(hex);
if (len % 2 != 0)
return 0;
len /= 2;
*out = (unsigned char *)malloc(len);
memset(*out, 'A', len);
for (i=0; i<len; i++) {
if (!hexchr2bin(hex[i*2], &b1) || !hexchr2bin(hex[i*2+1], &b2)) {
return 0;
}
(*out)[i] = (b1 << 4) | b2;
}
return len;
}
size_t bin2hex(const unsigned char *bin, size_t blen, unsigned char **hexout){
if (bin == NULL || blen == 0) return -1;
*hexout = (unsigned char *)malloc(blen * 2);
unsigned char *hex = *hexout;
size_t i;
for (i=0; i < blen; ++i) {
hex[i*2] = "0123456789ABCDEF"[bin[i] >> 4];
hex[i*2+1] = "0123456789ABCDEF"[bin[i] & 0x0F];
}
hex[blen*2] = '\0';
return blen*2;
}
size_t hex2bin(const unsigned char *old, unsigned char **str){
size_t target_length = strlen(old) >> 1;
*str = (unsigned char *) malloc(target_length);
unsigned char *ret = *str;
size_t i, j;
for (i = j = 0; i < target_length; i++) {
unsigned char c = old[j++];
unsigned char d;
if (c >= '0' && c <= '9') {
d = (c - '0') << 4;
} else if (c >= 'a' && c <= 'f') {
d = (c - 'a' + 10) << 4;
} else if (c >= 'A' && c <= 'F') {
d = (c - 'A' + 10) << 4;
} else {
free(str);
return -1;
}
c = old[j++];
if (c >= '0' && c <= '9') {
d |= c - '0';
} else if (c >= 'a' && c <= 'f') {
d |= c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
d |= c - 'A' + 10;
} else {
free(str);
return -1;
}
ret[i] = d;
}
ret[i] = '\0';
return i;
}
int main(){
/* test bin 2 hex */
unsigned char bindata[] = "this is a test str by jige003";
unsigned char *hexdata;
int hlen;
hlen = bin2hex(bindata, strlen(bindata), &hexdata);
P("hexdata: %s\n", hexdata);
/* test hex to bin */
unsigned char *origdata;
int blen;
blen = hex2bin(hexdata, &origdata);
P("orig data:%s\n", origdata);
assert( strcmp(bindata, origdata) == 0 );
return 0;
}

api

size_t bin2hex(const unsigned char *bin, size_t blen, unsigned char **hexout)

size_t hex2bin(const unsigned char *old, unsigned char **str)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment