【问题标题】:Converting Long -> Hex, then assigning that Hex to a Char in C转换 Long -> Hex,然后将该 Hex 分配给 C 中的 Char
【发布时间】:2013-12-02 13:46:57
【问题描述】:

我正在使用一个计算 16 位 CRC 校验和的函数。

该函数生成一个包含校验和的 LONG(以 10 为基数的数字格式)。当然,这可以以十六进制等效形式打印到控制台,如下所示:

printf("Checksum:  0x%x\n", crctablefast((unsigned char *)string, datalength));

对于一个给定的 20 字节字符数组进行检查,它会产生 Hex 格式的校验和 23277:

Checksum:  5AED

我需要将校验和作为 char 存储在 char 数组的第 21 位和第 22 位,如下所示:

Char [20] = 0x5A
Char [21] = 0xED

问题是像scanf和sscanf这样的函数,我能做的最好的就是按字面意思分配字符,如下:

Char [20] = "0x5A"
Char [21] = "0xED"

...这不好。

我可以做些什么来一次取两个字符,并使用它们将十六进制值分配给一个字符?还是一般来说有更简单的方法?

提前谢谢你!

【问题讨论】:

  • 我知道当我看到“23277”时,背景中发生的一切都是十六进制/二进制,所以我可能在这方面看错了望远镜的一端。我想这一定有一些非常简单的事情。
  • 您在寻找移位和掩蔽吗? ch[20] = crc & 0xff; ch[21] = (crc >> 8) & 0xff;
  • char[20] 只能容纳一个字符.. 注意 "0x5A" 是 4 个字符长,char[20] = "0x5A";甚至不工作
  • @H2CO3 我认为 OP 想要大端序 ch[20] = (crc >> 8) & 0xff; ch[21] = crc & 0xff;
  • @H2CO3 您能否将您的推荐发布为解决方案,我会对其进行评分并将其标记为可行的解决方案。也使用了小端。感谢 chux 的提醒。

标签: c char hex long-integer


【解决方案1】:

使用位掩码:

ch[20] = (crc >> 8) & 0xff;
ch[21] = crc & 0xff;

【讨论】:

  • 谢谢。这非常有效。我知道它必须非常简单..
【解决方案2】:

可以这样保存到字符或字符数组中:

字符 [20]=(字符) 0x5A; 字符 [21]=(字符) 0xED;

通过这种方式,它将保存十六进制数的整数值的等效字符,您可以通过转换将其转换回来并使用它。

嗯,背景中没有任何东西是十六进制的,机器中的一切都是二进制的,而人类做的事情是十进制的。所以,十六进制是一个人机界面,只是一个表示。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 2016-08-04
    • 2012-06-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2020-04-15
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多