在C语言中,将字节(byte,通常指unsigned char或char)转换为字符串(string,即以null结尾的字符数组)是一个常见操作,以下是几种实现方式,从基础到更实用的方法:

(图片来源网络,侵删)
直接转换单个字节为十六进制字符串
将一个字节的二进制值表示为两个十六进制字符(最常见的需求)。
#include <stdio.h>
// 方法1:使用数组查找表(高效)
void byteToHexString1(unsigned char byte, char* str) {
const char hex[] = "0123456789ABCDEF";
str[0] = hex[byte >> 4]; // 高4位
str[1] = hex[byte & 0x0F]; // 低4位
str[2] = '\0'; // 字符串结束符
}
// 方法2:使用sprintf(简单但依赖标准库)
void byteToHexString2(unsigned char byte, char* str) {
sprintf(str, "%02X", byte);
}
int main() {
unsigned char byte = 0xAB;
char str[3]; // 需要足够空间(2字符 + '\0')
byteToHexString1(byte, str);
printf("Hex: %s\n", str); // 输出: AB
byteToHexString2(byte, str);
printf("Hex: %s\n", str); // 输出: AB
return 0;
}
说明:
str需要至少3字节的空间(2个十六进制字符 +null终止符)。%02X确保输出两位大写十六进制,不足时补零。
转换字节数组为十六进制字符串
将多个字节(如unsigned char数组)转换为连续的十六进制字符串。
#include <stdio.h>
#include <string.h>
void bytesToHexString(const unsigned char* 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() {
unsigned char bytes[] = {0x01, 0xAB, 0xCD};
char str[7]; // 3字节 * 2 + '\0' = 7
bytesToHexString(bytes, sizeof(bytes), str);
printf("Hex: %s\n", str); // 输出: 01ABCDEF
return 0;
}
优化:避免循环中调用sprintf,改用位运算和查表(如方法1)可提升性能。

(图片来源网络,侵删)
处理任意字节数据(如二进制数据)
如果需要将字节数据直接转换为可打印字符串(可能包含非ASCII字符),需注意编码问题。
#include <stdio.h>
#include <stdlib.h>
// 示例:将字节转换为转义字符串(如 \x01\xAB)
void bytesToEscapedString(const unsigned char* bytes, size_t len, char* str) {
size_t pos = 0;
for (size_t i = 0; i < len; i++) {
if (bytes[i] >= 32 && bytes[i] <= 126) {
// 可打印字符直接复制
str[pos++] = bytes[i];
} else {
// 非打印字符转义为 \xHH
pos += sprintf(str + pos, "\\x%02X", bytes[i]);
}
}
str[pos] = '\0';
}
int main() {
unsigned char bytes[] = {0x01, 'A', 0x7F, 0x00};
char str[20]; // 根据实际数据调整大小
bytesToEscapedString(bytes, sizeof(bytes), str);
printf("Escaped: %s\n", str); // 输出: \x01A\x7F\x00
return 0;
}
使用第三方库(推荐)
实际项目中,建议使用成熟库处理复杂场景(如Base64、URL编码等):
- OpenSSL:提供
BN_bn2hex等函数。 - libb64:Base64编码/解码。
- C标准库:
strtol(十六进制字符串转整数)。
示例(OpenSSL):
#include <openssl/bn.h>
#include <stdio.h>
int main() {
unsigned char byte = 0xAB;
BIGNUM* bn = BN_new();
BN_set_word(bn, byte);
char* hex = BN_bn2hex(bn);
printf("Hex: %s\n", hex); // 输出: ab
OPENSSL_free(hex);
BN_free(bn);
return 0;
}
关键注意事项
- 缓冲区大小:确保目标字符串有足够空间(
n字节需要2n+1字节)。 - 大小写:
%X大写,%x小写。 - 字节序:多字节数据需注意字节序(大端/小端)。
- 安全性:避免缓冲区溢出,使用
snprintf代替sprintf。
根据需求选择合适的方法,简单场景用查表或sprintf,复杂场景用专业库。

(图片来源网络,侵删)
