micetools/src/micetools/lib/util/hex.c

58 lines
1.4 KiB
C

unsigned char hex_value(char c) {
if (isdigit((unsigned char)c)) return c - '0';
switch (c) {
case 'a':
case 'A':
return 0x0A;
case 'b':
case 'B':
return 0x0B;
case 'c':
case 'C':
return 0x0C;
case 'd':
case 'D':
return 0x0D;
case 'e':
case 'E':
return 0x0E;
case 'f':
case 'F':
return 0x0F;
default:
return 0xFF;
}
}
int hex_to_bin(char *hex, unsigned char *bin, int hex_len) {
if (hex_len == 0) return 1;
int work_len = 0;
for (int hex_ptr = 0; hex_ptr < hex_len; hex_ptr += 2, work_len++) {
char msn = hex[hex_ptr];
if ('0' <= msn && msn <= '9')
msn = msn - '0';
else if ('A' <= msn && msn <= 'F')
msn = msn - 'A' + 10;
else if ('a' <= msn && msn <= 'f')
msn = msn - 'a' + 10;
else
return 0;
char lsn = hex_ptr + 1 == hex_len ? '0' : hex[hex_ptr + 1];
if ('0' <= lsn && lsn <= '9')
lsn = lsn - '0';
else if ('A' <= lsn && lsn <= 'F')
lsn = lsn - 'A' + 10;
else if ('a' <= lsn && lsn <= 'f')
lsn = lsn - 'a' + 10;
else
return 0;
bin[work_len] = msn << 4 | lsn;
}
return 1;
}