gpt4 book ai didi

二进制转十六进制并进行运算

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:59 26 4
gpt4 key购买 nike

我是 C 的新手,我已经尝试了很多方法将存储 binary 表示形式的 char* 变量转换为 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);

输出是:

binary 0110110000001110110000010100111000110011110110110111000110111000 hex 33db71b8

这是不正确的。谁能指出我哪里出错了?

最佳答案

为什么要将十六进制的 16 个字符压缩成一个 12 字节的字符串,它实际上只能处理 11 个字符加上一个空终止符。如果在适当的位置包含换行符,它还有助于提高输出的可读性。使用 unsigned long longstrtoull() 可能会做得更好 — 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)。因此,代码有很大的更改和改进空间。

关于二进制转十六进制并进行运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49643862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com