我是C
的新手,我已经尝试了很多方法将char*
变量存储为binary
表示形式转换为hex
值。
变量例如是:
0110110000001110110000010100111000110011110110110111000110111000
代表
6C 0E C1 4E 33 DB 71 B8
,其中
0110- 6, 1100 - C, 0000 - 0, 1110 - E and so on...
但是,当我想使用fprintf
格式或strtol
时,我发现这是针对此类问题的建议,我得到:
char* lm_bin = "0110110000001110110000010100111000110011110110110111000110111000";
//convert to dec
int lm_dec = (int)strtol(lm_bin, NULL, 2);
char lm_hex[12];
//convert to hex
sprintf(lm_hex, "%x", lm_dec);
fprintf(stderr, "binary %s", lm_bin);
fprintf(stderr, "hex %s", lm_hex);
输出是:
二进制 0110110000001110110000010100111000110011110110110111000110111000 hex 33db71b8
这是不正确的。谁能指出我在哪里犯错?
答案 0 :(得分:3)
为什么要尝试将16个十六进制字符压缩成12个字节的字符串,这个字符串只能处理11个字符加上一个空终止符。如果在适当的点包含换行符,它还有助于输出的可读性。使用unsigned long long
和strtoull()
时,您可能会做得更好 - int
在大多数计算机上都不会保留16位十六进制数字。在标准输出上写入预期输出也是常规的;对错误消息使用标准错误。
将这些更改放在一起会产生一个MCVE(Minimal, Complete, Verifiable Example),如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char lm_bin[] = "0110110000001110110000010100111000110011110110110111000110111000";
unsigned long long lm_dec = strtoull(lm_bin, NULL, 2);
char lm_hex[17];
sprintf(lm_hex, "%llx", lm_dec);
printf("binary %s\n", lm_bin);
printf("hex %s\n", lm_hex);
return 0;
}
我相信,你所寻求的产出就是你所想要的:
binary 0110110000001110110000010100111000110011110110110111000110111000
hex 6c0ec14e33db71b8
该代码不检查转换错误,可以使用snprintf()
代替sprintf()
,并且可以通过一次调用printf()
完成所有打印 - 而且不需要将字符串用于十六进制格式的输出(它可以直接格式化lm_dec
)。因此,代码中有很多变化和改进的空间。