Преобразовать целое число без знака с шестнадцатеричными числами в строку - PullRequest
1 голос
/ 18 июня 2019

У меня есть массив _u8 с шестнадцатеричными числами в нем, например, в виде: A81B6A9D4D2E.И я хочу превратить его в строку в виде: A8-1B-6A-9D-4D-2E и сделать его в виде строки для отправки.

#define SL_MAC_ADDR_LEN     UINT8_C(6)
_u8 wlanMacAddressVal[SL_MAC_ADDR_LEN];

Я могу напечатать его сЦикл выглядит следующим образом:

for(int i = 0; i < SL_MAC_ADDR_LEN; i++){
printf(%X, wlanMacAddressVal[i]);
printf("-");
}

Но когда я пытаюсь создать строку / chararray и использовать функцию strcat, мои результаты всегда странные символы.

Я пробовал использовать sprintf () вцикл, но он всегда перезаписывает последние шестнадцатеричные числа

sprintf(wlanMacString,"%X",(_u8 *)wlanMacAddressVal[i]);

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

Если вы используете аппаратное обеспечение с ограниченными ресурсами (например, uC), использование sprintf не очень хорошая идея.

static const char digits[]="0123456789ABCDEF";

char *bytetostr(char *buff, const uint8_t val)
{
    buff[0] = digits[val >> 4];
    buff[1] = digits[val & 0x0f];
    buff[2] = 0;
    return buff;
}


char *bytearrtostring(char *buff, const uint8_t *arr, size_t length, const int separator)
{
    char *result = buff;

    while(length)
    {
        bytetostr(buff, *arr++);
        if(--length)
        {
             buff[2] = separator;
             buff += 3;
        }
    }
    buff = 0;

    return result;
}

int main()
{
    uint8_t array[] = {0xa1, 0x45, 0xde, 0x67, 0xff, 0x00};

    char buff[100];

    printf("%s\n", bytearrtostring(buff, array, sizeof(array), '-'));
}

Вы можете поэкспериментировать самостоятельно https://onlinegdb.com/HJy5KGLyS

https://godbolt.org/z/3bQa1-

3 голосов
/ 18 июня 2019

Используйте sprintf с указателем формата 02x.

char buf[SL_MAC_ADDR_LEN*3]; //2*number of hex bytes + number of `-` symbols + \0.


char *p = buf;
for (int i=0;i<SL_MAC_ADDR_LEN;i++)
  p += sprintf(p, i ? "-%02hhx":"%02hhx", _u8Array[i]);

Обратите внимание, что вам нужно продвинуться p, чтобы пропустить количество байтов, напечатанных в буфере.

...