Хранение 2 шестнадцатеричных символов в одном байте в C - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть строка символов, которые каждые 2 символа представляют шестнадцатеричное значение, например:

unsigned char msg[] = "04FF";

Я хотел бы сохранить "04" в байте и FF в другом байте?

Вывод желания должен быть примерно таким,

unsigned short first_hex = 0x04; 
unsigned second_hex = 0xFF;

memcpy(hex_msg_p, &first_hex,1);
hex_msg_p++;
memcpy(hex_msg_p, &second_hex,1);
hex_msg_p++;

Моя строка очень длинная, и я действительно хотел бы автоматизировать процесс.

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

unsigned char msg[] = { 0x04, 0xFF };

Что касается преобразования из строки, вам нужно прочитать строку по два символа за раз:

usigned char result;
if (isdigit(string[i]))
  result = string[i]-'0';
else if (isupper(string[i]))
  result = string[i]-'A';
else if (islower(string[i]))
  result = string[i]-'a';

умножить на 16 и повторить

3 голосов
/ 12 ноября 2010

Предполагая, что ваши данные верны (ASCII, действительные шестнадцатеричные символы, правильная длина), вы должны иметь возможность сделать что-то вроде.

unsigned char *mkBytArray (char *s, int *len) {
    unsigned char *ret;

    *len = 0;
    if (*s == '\0') return NULL;
    ret = malloc (strlen (s) / 2);
    if (ret == NULL) return NULL;

    while (*s != '\0') {
        if (*s > '9')
            ret[*len] = ((tolower(*s) - 'a') + 10) << 4;
        else
            ret[*len] = (*s - '0') << 4;
        s++;
        if (*s > '9')
            ret[*len] |= tolower(*s) - 'a' + 10;
        else
            ret[*len] |= *s - '0';
        s++;
        *len++;
    }
    return ret;
}

Это даст вам массив неподписанных символов, которые вы несете ответственность за освобождение. Он также установит переменную len равной размеру, чтобы вы могли легко ее обработать.

Причина, по которой он должен быть ASCII, заключается в том, что ISO предписывает только то, что числовые символы являются последовательными. Все ставки на альфы отменены.

2 голосов
/ 12 ноября 2010
int first_hex, second_hex;

sscanf(msg,"%02X%02X", &first_hex, &second_hex);

Важное замечание: first_hex и second_hex должны иметь тип int для использования, как в этом примере.

И если я вас правильно понимаю, вы хотите сделать следующее:

char *pIn=msg;
char *pOut=hex_msg;
while(*pIn)
{
    int hex;
    if (*(pIn+1)==0)
    {
      // handle format error: odd number of hex digits
      ...
      break;
    }
    sscanf(pIn, "%02X", &hex);
    *pOut++=(char)hex;
    pIn+=2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...