-1

我有一个计算 32 位 CRC 的函数,

我有一个保存 CRC 的类的内部变量。

验证 CRC 一致性的函数返回 CRC 类的布尔结果以及该类正在计算的结果,

类中的成员函数执行下一个,

将 CRC 保存到临时变量中,计算 CRC 然后比较两个值。

bool X::CRCisMatching()
{
   unsigned long tmpCRC = ClassCRC;
   ClassCRC = GetNewCalculatedCRC();
   printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);
   return tmpCRC == ClassCRC;
}

问题是我得到了这个输出,

comparing AB44CD2A33 ~ with ~ AB44CD2A33

为什么我得到 10 个值而不是 %08x 预期的 8 个值

以前有没有人遇到过类似的问题??

顺便说一句,我使用的是 32 位机器

4

2 回答 2

0

sizeof(int) 不符合预期并且printf()(或帖子)有问题。

printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);

OP 报告此打印的“比较 AB44CD2A33 ~ 与 ~ AB44CD2A33”。这意味着正在寻找 的格式说明符“%08x”int找到了int一个需要超过 4 个字节才能表示的值。这暗示 anint是 8 个字节。报告的 32 位机器建议,但未指定int宽度。此外,8in%08x仅指定最小打印宽度。

OP 通过了 aunsigned long并且打印说明符需要一个unsigned. 我怀疑这不会影响假设这两种类型在 OP 的机器上相同的问题。好的代码会使用%08lxto match的 printf 说明符unsigned long

OP 报告了“AB44CD2A33”的输出。使用%x格式说明符,预计会输出“ab44cd2a33”。尽管这可能只是一个转录错误,但它引起了人们对帖子在其他地方错误或编译器不兼容的担忧。

如果 OP 想要为 32 位 CRC 使用明确的 32 位值,建议使用 typeuint32_t和 PRIX32 进行打印。

#include <inttypes.h>
uint32_t tmpCRC = ClassCRC;
printf("0x%" PRIX32 "\n", tmpCRC);
于 2013-09-06T17:24:57.503 回答
0

因为%08x意味着最小长度为 8,而不是最大长度。而且你的机器是 32 位还是 64 位不一定控制long. 我建议你打印出来 sizeof(unsigned long)确认它的大小。

通常(尽管不能保证),32 位系统将具有 32 位unsigned int. C 提供了特定宽度的类型,例如uint32_t,这在 C++11 中也可以通过cstdint 头文件获得。(假设有一个提供它的基础类型)。

如果您的编译器足够现代,我的建议是使用该类型,否则,假设您发现sizeof(unsigned int) == 4(并且您的字节是 8 位),这就是您可能应该使用的类型。

于 2013-08-01T02:23:52.080 回答