【发布时间】: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