You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中char*类型二进制字符串转十六进制值的问题

解决长二进制字符串转十六进制的问题

嘿,我懂你刚碰C语言时处理这种长二进制串转十六进制的挫败感——毕竟strtol或者直接用fprintf格式化这类常规方法,碰到这么长的二进制串根本顶不住:要么是数值溢出,要么是完全达不到你要的分组输出格式。咱们来一步步搞定它:

核心思路

既然规则是每4位二进制对应1位十六进制,那我们直接把长字符串拆成4位一组,逐个转换就行。如果原串长度不是4的倍数,记得在前面补0,保证所有二进制位都能完整分组。

完整代码实现

#include <stdio.h>
#include <string.h>
#include <ctype.h>

// 将4位二进制子串转换为单个十六进制字符
char bin_to_hex(const char *bin) {
    int value = 0;
    // 移位计算4位二进制对应的十进制值
    for (int i = 0; i < 4; i++) {
        value = (value << 1) | (bin[i] - '0');
    }
    // 返回对应的十六进制字符(这里用大写,要小写的话换成"0123456789abcdef")
    return "0123456789ABCDEF"[value];
}

int main() {
    char* lm_bin = "0110110000001110110000010100111000110011110110110111000110111000";
    int bin_len = strlen(lm_bin);
    
    // 第一步:检查输入的二进制串是否合法(只能包含'0'和'1')
    for (int i = 0; i < bin_len; i++) {
        if (!isdigit(lm_bin[i]) || lm_bin[i] > '1') {
            printf("Error: 非法字符出现在第%d位 -> '%c'\n", i+1, lm_bin[i]);
            return 1;
        }
    }
    
    // 第二步:计算需要补的前导0数量,让总长度是4的倍数
    int padding = (4 - (bin_len % 4)) % 4;
    
    printf("转换后的十六进制结果:");
    // 先输出补的前导0(如果有的话)
    for (int i = 0; i < padding; i++) {
        printf("0");
    }
    
    // 第三步:循环处理每4位二进制,转成十六进制并输出
    for (int i = 0; i < bin_len; i += 4) {
        char hex_char = bin_to_hex(lm_bin + i);
        printf("%c", hex_char);
        // 每两位十六进制加一个空格(和你给出的示例格式对齐)
        if ((i + 4 + padding) % 8 == 0 && (i + 4) != bin_len) {
            printf(" ");
        }
    }
    printf("\n");
    
    return 0;
}

代码解释

  1. bin_to_hex函数:通过移位运算把4位二进制转成0-15的十进制值,再从预定义的十六进制字符数组里取出对应字符,简单高效。
  2. 输入合法性检查:避免非法字符(比如'2'、字母)导致转换出错。
  3. 前导补0:确保二进制串长度是4的倍数,不会出现剩余1-3位无法分组的情况。
  4. 格式输出:每两位十六进制加空格,和你给出的6C 0E C1 4E 33 DB 71 B8格式完全一致。

为什么之前的方法失效?

  • strtol:它只能把二进制串转成整数类型,但你的二进制串有64位,远超32位整数范围,就算用64位的strtoul,也没法直接输出你要的分组格式,还可能碰到符号溢出问题。
  • fprintf格式化:C语言没有直接支持二进制字符串转十六进制的格式化符,所以这条路走不通。

内容的提问来源于stack exchange,提问作者Mithrand1r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:37:25