C语言实现 hex 转 str
在C语言中,将十六进制数据转换为字符串是一个常见的需求,下面我将介绍几种实现方法,从简单到复杂,并提供完整的代码示例。

(图片来源网络,侵删)
方法1:使用标准库函数(最简单)
如果只是将十六进制数转换为对应的字符串表示,可以使用标准库的sprintf或snprintf函数:
#include <stdio.h>
#include <inttypes.h>
void hex_to_str_simple(uint8_t hex, char* str) {
snprintf(str, 3, "%02X", hex);
}
int main() {
uint8_t hex_value = 0xAB;
char str[3];
hex_to_str_simple(hex_value, str);
printf("Hex: 0x%02X, String: %s\n", hex_value, str);
return 0;
}
方法2:处理字节数组
如果需要将字节数组转换为十六进制字符串表示:
#include <stdio.h>
#include <stdint.h>
void bytes_to_hex_str(const uint8_t* bytes, size_t len, char* str) {
for (size_t i = 0; i < len; i++) {
sprintf(&str[i*2], "%02X", bytes[i]);
}
str[len*2] = '\0';
}
int main() {
uint8_t bytes[] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xEF};
char hex_str[17]; // 8 bytes * 2 chars per byte + null terminator
bytes_to_hex_str(bytes, sizeof(bytes), hex_str);
printf("Bytes: %s\n", hex_str);
return 0;
}
方法3:处理大端/小端转换
如果需要处理大端或小端格式的十六进制数据:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
void hex_str_to_bytes(const char* hex_str, uint8_t* bytes, size_t len) {
for (size_t i = 0; i < len; i++) {
sscanf(&hex_str[i*2], "%02hhX", &bytes[i]);
}
}
void bytes_to_hex_str_be(const uint8_t* bytes, size_t len, char* str) {
for (size_t i = 0; i < len; i++) {
sprintf(&str[i*2], "%02X", bytes[i]);
}
str[len*2] = '\0';
}
void bytes_to_hex_str_le(const uint8_t* bytes, size_t len, char* str) {
for (size_t i = 0; i < len; i++) {
sprintf(&str[i*2], "%02X", bytes[len-1-i]);
}
str[len*2] = '\0';
}
int main() {
uint8_t bytes_be[] = {0x12, 0x34, 0x56, 0x78};
uint8_t bytes_le[] = {0x78, 0x56, 0x34, 0x12};
char hex_str[9];
// Big-endian
bytes_to_hex_str_be(bytes_be, sizeof(bytes_be), hex_str);
printf("Big-endian: %s\n", hex_str);
// Little-endian
bytes_to_hex_str_le(bytes_le, sizeof(bytes_le), hex_str);
printf("Little-endian: %s\n", hex_str);
return 0;
}
方法4:更高效的实现(避免sprintf)
对于性能敏感的场景,可以避免使用sprintf,直接进行字符转换:

(图片来源网络,侵删)
#include <stdio.h>
#include <stdint.h>
static const char hex_chars[] = "0123456789ABCDEF";
void bytes_to_hex_str_fast(const uint8_t* bytes, size_t len, char* str) {
for (size_t i = 0; i < len; i++) {
str[i*2] = hex_chars[bytes[i] >> 4];
str[i*2 + 1] = hex_chars[bytes[i] & 0x0F];
}
str[len*2] = '\0';
}
int main() {
uint8_t bytes[] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xEF};
char hex_str[17];
bytes_to_hex_str_fast(bytes, sizeof(bytes), hex_str);
printf("Fast conversion: %s\n", hex_str);
return 0;
}
方法5:处理十六进制字符串转换为字节
这是反向操作,将十六进制字符串转换为字节数组:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <ctype.h>
int hex_str_to_bytes(const char* hex_str, uint8_t* bytes, size_t max_len) {
size_t len = strlen(hex_str);
if (len % 2 != 0 || len/2 > max_len) {
return -1; // 错误:奇数长度或缓冲区不足
}
for (size_t i = 0; i < len; i += 2) {
char high = toupper(hex_str[i]);
char low = toupper(hex_str[i+1]);
if ((high < '0' || high > 'F' || high > '9' && high < 'A') ||
(low < '0' || low > 'F' || low > '9' && low < 'A')) {
return -1; // 无效的十六进制字符
}
bytes[i/2] = (high >= 'A' ? high - 'A' + 10 : high - '0') << 4 |
(low >= 'A' ? low - 'A' + 10 : low - '0');
}
return 0;
}
int main() {
const char* hex_str = "1234567890ABCDEF";
uint8_t bytes[8];
if (hex_str_to_bytes(hex_str, bytes, sizeof(bytes)) == 0) {
printf("Converted bytes: ");
for (size_t i = 0; i < sizeof(bytes); i++) {
printf("%02X ", bytes[i]);
}
printf("\n");
} else {
printf("Invalid hex string or buffer too small\n");
}
return 0;
}
提供了几种不同的C语言实现hex到str转换的方法:
- 简单转换:使用
sprintf将单个字节转换为两位十六进制字符串 - 字节数组转换:将字节数组转换为十六进制字符串
- 大小端处理:处理大端和小端格式的转换
- 高效实现:避免
sprintf,直接使用查找表进行转换 - 反向转换:将十六进制字符串转换回字节数组
选择哪种方法取决于你的具体需求,包括性能要求、数据格式和错误处理需求,对于大多数应用,方法2或方法4是不错的选择。

(图片来源网络,侵删)
