1

我在这里真的很沮丧。尝试实现 CRC-CCITT 算法,我在 Internet 站点上找到了一个非常好的示例。

有一行我完全不明白其输出:

unsigned short update_crc_ccitt( unsigned short crc, char c){
[...]
short_c  = 0x00ff & (unsigned short) c;
[...]
}

我想计算"test"字符串的 CRC "123456789"。所以在第一次运行中 char 'c' 是 1。根据我的理解short_c,第一次运行应该也等于1,但是当我将它打印到控制台时,我得到short_c = 49c = 1. 如何?

0x00ff in binary is: 1 1 1 1 1 1 1 1 
char 1 in binary is: 0 0 0 0 0 0 0 1
bitand should be   : 0 0 0 0 0 0 0 1 

我的错误在哪里?

4

2 回答 2

3

该字符1的 ASCII 码为 0x31 = 49。这与 ASCII 码为 1 的字符(即^A)不同。

于 2013-09-06T07:29:16.177 回答
2

基本上,您混淆了字符和数字。字符串中的第一个字母"123456789"是字符'1',在大多数典型计算机上其十进制值为 49。

该值由字符编码决定,它描述了如何为每个字符分配一个数值,该数值是您的计算机存储的。

C 保证 10 位十进制数字的编码将是一个没有间隙的紧凑序列,以'0'. 因此,您始终可以通过执行以下操作将字符转换为相应的数字:

const int digitValue = digit - '0';

这会将 digit 转换'0'为 integer 0,等等(包括)所有数字'9'

于 2013-09-06T07:30:14.853 回答