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; }
代码解释
bin_to_hex函数:通过移位运算把4位二进制转成0-15的十进制值,再从预定义的十六进制字符数组里取出对应字符,简单高效。- 输入合法性检查:避免非法字符(比如'2'、字母)导致转换出错。
- 前导补0:确保二进制串长度是4的倍数,不会出现剩余1-3位无法分组的情况。
- 格式输出:每两位十六进制加空格,和你给出的
6C 0E C1 4E 33 DB 71 B8格式完全一致。
为什么之前的方法失效?
strtol:它只能把二进制串转成整数类型,但你的二进制串有64位,远超32位整数范围,就算用64位的strtoul,也没法直接输出你要的分组格式,还可能碰到符号溢出问题。fprintf格式化:C语言没有直接支持二进制字符串转十六进制的格式化符,所以这条路走不通。
内容的提问来源于stack exchange,提问作者Mithrand1r
相关产品推荐
相关产品推荐

