十六进制数据转换为对应的字符串
十六进制数据转换为对应的字符串(例如 0x08
转换为 "08"
),你可以按照以下步骤实现:
方法 1:使用 sprintf
逐个字节转换
#include <stdio.h>void hex_to_str(const unsigned char *hex, int len, char *str) {for (int i = 0; i < len; i++) {sprintf(str + i * 2, "%02X", hex[i]); // 大写字母// 或者用小写字母:// sprintf(str + i * 2, "%02x", hex[i]);}
}int main() {unsigned char can_id_data[12] = {0x08, 0xAB, 0xCD, 0x1F, 0x23, 0x45, 0x67, 0x89, 0x0A, 0xBC, 0xDE, 0xF0};char str[25] = {0}; // 12字节 * 2字符 + 1终止符 = 25字节hex_to_str(can_id_data, 12, str);printf("Result: %s\n", str); // 输出: "08ABCD1F234567890ABCDEF0"return 0;
}
方法 2:手动转换(避免 sprintf
)
#include <stdio.h>void hex_to_str(const unsigned char *hex, int len, char *str) {const char *hex_chars = "0123456789ABCDEF"; // 大写字母// 或者用小写字母:// const char *hex_chars = "0123456789abcdef";for (int i = 0; i < len; i++) {str[i * 2] = hex_chars[(hex[i] >> 4) & 0x0F]; // 高4位str[i * 2 + 1] = hex_chars[hex[i] & 0x0F]; // 低4位}str[len * 2] = '\0'; // 终止符
}int main() {unsigned char can_id_data[12] = {0x08, 0xAB, 0xCD, 0x1F, 0x23, 0x45, 0x67, 0x89, 0x0A, 0xBC, 0xDE, 0xF0};char str[25] = {0}; // 12字节 * 2字符 + 1终止符 = 25字节hex_to_str(can_id_data, 12, str);printf("Result: %s\n", str); // 输出: "08ABCD1F234567890ABCDEF0"return 0;
}
注意事项:
-
大小写选择:
-
使用
%02X
或"0123456789ABCDEF"
会生成大写字母(如"08AB"
)。 -
使用
%02x
或"0123456789abcdef"
会生成小写字母(如"08ab"
)。
-
-
缓冲区大小:
-
确保
str
足够大(2 * len + 1
),以容纳转换后的字符串和终止符\0
。
-
-
性能:
-
方法 2(手动转换)通常比方法 1(
sprintf
)更快,适合高性能场景。
-
示例输出:
如果 can_id_data
包含 {0x08, 0xAB, 0xCD, 0x1F, ...}
,转换后的字符串为:
"08ABCD1F234567890ABCDEF0" // 大写
"08abcd1f234567890abcdef0" // 小写