我有一个带有十六进制数的_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("-");
}
但是当我尝试创建一个字符串/字符数组并使用strcat函数时,我的结果总是奇怪的符号。
我尝试在循环中使用sprintf(),但它总是会覆盖最后的十六进制
sprintf(wlanMacString,"%X",(_u8 *)wlanMacAddressVal[i]);
答案 0 :(得分:3)
将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
才能跳过缓冲区中到目前为止已打印的字节数。
答案 1 :(得分:3)
如果您使用的是resurce受限的硬件(例如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), '-'));
}