16进制数字与16进制字符串转换
16进制数字->16进制字符串
unsigned int hexnumber_to_hexstring(unsigned char *hex_buf, unsigned int convert_len, char *str_buf, unsigned int str_size)
{
if (!str_buf || !hex_buf) return 0;
if (str_size <= 2 * convert_len) return 0;
unsigned int j = 0;
const char ascii[] = "0123456789ABCDEF";
for (unsigned int i = 0; i < convert_len; i++, j += 2)
{
str_buf[j] = ascii[(hex_buf[i] & 0xF0) >> 4];
str_buf[j + 1] = ascii[hex_buf[i] & 0x0F];
}
str_buf[j] = '\0';
return j;
}
16进制字符串->16进制数字
unsigned int hexstring_to_hexnumber(char *str_buf, unsigned int convert_len, unsigned char *hex_buf, unsigned int hex_size)
{
if (!str_buf || !hex_buf) return 0;
if (hex_size < (convert_len / 2) + (convert_len % 2)) return 0;
unsigned char hex_u8 = 0;
unsigned int hex_len = 0;
for (unsigned int i = 0; i < convert_len; i++)
{
if ('0' <= str_buf[i] && str_buf[i] <= '9')
{
hex_u8 = str_buf[i] - '0';
}
else if ('A' <= str_buf[i] && str_buf[i] <= 'F')
{
hex_u8 = str_buf[i] - 'A' + 10;
}
else if ('a' <= str_buf[i] && str_buf[i] <= 'f')
{
hex_u8 = str_buf[i] - 'a' + 10;
}
else
{
hex_u8 = 0xFF;
}
if (0xFF != hex_u8)
{
if (0 == i % 2)
{
hex_buf[i / 2] = hex_u8 << 4;
hex_len++;
}
else
{
hex_buf[i / 2] |= hex_u8;
}
}
else
{
return 0;
}
}
return hex_len;
}
示例
char string[100] = "23456a7a8a9a0a6";
unsigned char hex_tmp[100] = {0};
unsigned char hex[100] = {0x00, 0x01, 0xa2, 0xba, 0x0b, 0x0c};
char string_tmp[100] = {0};
int main(int argc, char **argv)
{
unsigned int len = 0;
len = hexstring_to_hexnumber(string, strlen(string), hex_tmp, sizeof(hex_tmp));
printf("hexstring_to_hexnumber len:%u\n", len);
for (int i = 0; i < len; i++) printf("%02X ", hex_tmp[i]);
len = hexnumber_to_hexstring(hex, 6, string_tmp, sizeof(string_tmp));
printf("\n\nhexnumber_to_hexstring len:%u\n", len);
printf("%s", string_tmp);
return 0;
}
hexstring_to_hexnumber len:8
23 45 6A 7A 8A 9A 0A 60
hexnumber_to_hexstring len:12
0001A2BA0B0C
--------------------------------