2015-03-02 3 views
-2

Я пытаюсь преобразовать 64-битный адрес zigbee в его эквивалентный шестнадцатеричный адрес. Я прошел много сообщений, но не нашел решения. У меня 64-разрядный адрес в строчном формате, и я хочу, чтобы он был в его эквивалентном шестнадцатеричном формате.Как преобразовать 64-битную строку в шестнадцатеричный?

К примеру, у меня есть

unsigned char ZbAddStr[16] = "0013A20040B5A5EE"

, и я хочу, чтобы преобразовать его в

unsigned char ZbAddNew[8] = {0x00, 0x13, 0xA2, 0x00, 0x40, 0xB5, 0xA5, 0xEE}.

Как это сделать?

ответ

2
  1. Скопируйте два байта из ZbAddStr во временную строку.

  2. Используйте strtol, чтобы извлечь номер из этих двух байтов, используя 16 в качестве базы.

  3. Сохраните номер до ZbAddNew.

Это должно работать:

char temp[3] = {0}; 
for (int i = 0; i < 16; i += 2) 
{ 
    temp[0] = ZbAddStr[i]; 
    temp[1] = ZbAddStr[i+1]; 
    int num = strtol(temp, NULL, 16); 
    ZbAddNew[i/2] = num; 
} 

Это также должно работать (спасибо @JonathanLeffler):

for (int i = 0; i < 8; ++i) 
{ 
    sscanf((char*)&ZbAddStr[2*i], "%2X", &ZbAddNum[i]); 
} 
+1

Будет ли какие-либо серьезные недостатки в использовании 'sscanf()', возможно, с строка формата монстра ''% 2X% 2X ...% 2X% 2X "и 8 адресов или в цикле' for (int i = 0; i <8; i ++) sscanf (& ZbAddStr [2 * i], "% 2X ", & ZbAddNew [i]);'? –

+0

@JonathanLeffler, я не пробовал первое предложение, но второе работает для меня. Я не вижу каких-либо серьезных плюсов/минусов, тонких или иных, между этими двумя подходами. –

+0

@CoolNik, хорошо для вас. –

Смежные вопросы