C语言hex转str,如何实现?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 C语言 正文

C语言实现 hex 转 str

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

c语言hextostr
(图片来源网络,侵删)

方法1:使用标准库函数(最简单)

如果只是将十六进制数转换为对应的字符串表示,可以使用标准库的sprintfsnprintf函数:

#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,直接进行字符转换:

c语言hextostr
(图片来源网络,侵删)
#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转换的方法:

  1. 简单转换:使用sprintf将单个字节转换为两位十六进制字符串
  2. 字节数组转换:将字节数组转换为十六进制字符串
  3. 大小端处理:处理大端和小端格式的转换
  4. 高效实现:避免sprintf,直接使用查找表进行转换
  5. 反向转换:将十六进制字符串转换回字节数组

选择哪种方法取决于你的具体需求,包括性能要求、数据格式和错误处理需求,对于大多数应用,方法2或方法4是不错的选择。

c语言hextostr
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
Gearman C语言如何高效实现任务分发?
« 上一篇 04-30
dede移动端静态化如何实现?
下一篇 » 04-30

相关文章

取消
微信二维码
支付宝二维码

目录[+]