У меня есть функция, которая рассчитывает 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 значений вместо 8, как и предполагалось с% 08x
кто-нибудь сталкивался с подобной проблемой раньше?
Кстати, я использую 32-битную машину
Так как %08x
означает минимальный длина 8, не максимальная. И то, является ли ваша машина 32-битной или 64-битной, не обязательно контролирует размер long
, Я предлагаю вам распечатать sizeof(unsigned long)
подтвердить его размер.
Обычно (хотя и не гарантировано) 32-битные системы будут иметь 32-битные unsigned int
, C предоставляет типы определенной ширины, такие как uint32_t
и это также доступно в C ++ 11 через cstdint
заголовок. (при условии, что есть базовый тип, который обеспечивает это).
Мой совет будет использовать этот тип, если ваш компилятор достаточно современный, в противном случае, если вы обнаружите, sizeof(unsigned int) == 4
(и ваши байты восемь битов), это тип, который вы, вероятно, должны использовать.
sizeof (int) не так, как ожидалось а также printf()
(или пост) не так.
printf("comparing %08x ~ with ~ %08x!\n", tmpCRC, ClassCRC);
ОП сообщает об этом напечатанном «сравнении AB44CD2A33 ~ с ~ AB44CD2A33». Это означает, что спецификатор формата «% 08x», который ищет int
, нашел int
со значением, которое требуется более 4 байтов для представления. Это намекает на то, что int
8 байт. Сообщаемая 32-битная машина предлагает, но не указывает int
ширина. Кроме того, 8
в %08x
указывает только минимальный ширина печати.
ОП прошел unsigned long
и спецификатор печати ожидал unsigned
, Я подозреваю, что это не повлияло на проблему, если предположить, что эти два типа одинаковы на машине OP. Хороший код использовал бы спецификатор printf %08lx
чтобы соответствовать unsigned long
,
ОП сообщил о выходе «AB44CD2A33». С %x
спецификатор формата, выход «ab44cd2a33» ожидается. Хотя это может быть просто ошибкой транскрипции, это вызывает опасения, что сообщение ошибочно в других местах или что компилятор не соответствует.
Если OP хочет использовать определенное 32-битное значение для 32-битной CRC, рекомендуем использовать тип uint32_t
и PRIX32 для печати.
#include <inttypes.h>
uint32_t tmpCRC = ClassCRC;
printf("0x%" PRIX32 "\n", tmpCRC);