Reputation: 1697
I have found a whole lot of different solutions to this problem, but not all of them work, and a lot of them seem somewhat hacky and inefficient. Basically I have a string of hexadecimal data (i.e. "55 AA 41 2A 00 94 55 AA BB BB 00 FF") which I would like to convert to raw data. What is the best way to do this?
UPDATE: Vicky's solution worked great for me, but I changed it to work with hexadecimal strings that don't have spaces in between and changed the style a bit.
int i = 0;
char *hexString = "55AA412A009455AABBBB00FF"
char *hexPtr = hexString;
unsigned int *result = calloc(strlen(hexString)/2 + 1, sizeof *result);
while (sscanf(hexPtr, "%02x", &result[i++])) {
hexPtr += 2;
if (hexPtr >= hexString + strlen(hexString)) break;
}
return result;
Upvotes: 3
Views: 2657
Reputation: 21
/*
* copyLeft (ButterC) All Right Changed :)
*/
void _StackOverFlow(void *data) {
unsigned char *ButterC = (unsigned char *) data;
size_t ssize ,size = ssize = 0;
int i;
for (i = 0; ButterC[i] != 0; i++)
{
if (ButterC[i] != 32)
size++;
}
unsigned int *resu = (unsigned int *) malloc((size / 2) + 1);
while (*ButterC != 0 && resu != NULL && ssize < size)
{
if (*ButterC == 32)
ButterC++;
else {
sscanf(ButterC,"%02x",&resu[ssize++]); ButterC += 2;
}
}
// TEST RESULTE TO => (resu)
for (i = 0; i < ssize; i++)
{
printf("%02X ",resu[i] & 0xff);
}
puts(""); // NEWLINE
}
int _start() {
char data[] = "FF 00FF 01";
_StackOverFlow(data);
_exit(0);
}
Upvotes: 0
Reputation: 1
while(input[i]!='\0'){
*(temp++) = ((input[i]>='0' && input[i]<='9')?(input[i]-'0'):(input[i]-'a'+10))*16 +( (input[i+1]>='0' && input[i]<='9')?(input[i+1]-'0'):(input[i+1]-'a'+10));
i+=2;
}
Upvotes: 0
Reputation: 13244
Is the string always the same length?
If so:
char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF";
sscanf(buf, "%x %x %x [repeat as many times as necessary]", &a, &b, &c [etc]);
If not:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char ** argv)
{
char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF";
char *p = buf;
int i = 0, j;
unsigned int *result = calloc(strlen(buf)/3 + 1 * sizeof(int), 1);
if (result)
{
while (sscanf(p, "%02x", &result[i++]))
{
p += 3;
if (p > buf + strlen(buf))
{
break;
}
}
printf("%s\n", buf);
for (j = 0; j < i; j++)
{
printf("%02X ", result[j]);
}
printf("\n");
}
}
Upvotes: 2
Reputation: 35008
#define GETBITS(a) (a < 'A' ? a - '0' : toupper(a) - 'A' + 10)
char *cur;
char data;
for (cur = buffer; *cur; cur++) {
data = GETBITS(cur[0]) << 4 + GETBITS(cur[1]);
cur += 2;
printf("%c", data);
}
printf("\n");
Upvotes: 0