问题描述
我被赋予了一项从C ++中的光纤通道帧计算CRC值的任务。为了验证我的CRC值正确,我正在根据硬件计算的CRC值对其进行检查。不幸的是,我不知道生成硬件计算出的CRC值的特定算法。我只需要确保我的软件生成的CRC值与硬件CRC值匹配即可。
我一直在使用boost :: crc_32_type来计算我的CRC值。但是,我获得的每个单个CRC值都与任何硬件计算出的CRC值都不匹配。关于可能的原因有什么想法吗?
我还想知道的是,如何在光纤通道帧中计算CRC值?它是仅根据有效负载还是帧头+有效负载计算得出的?我似乎找不到确切的答案。我尝试过计算两者,但仍然没有成功。
很遗憾,我无法显示用于crc计算的任何实际数据。基本上,这是我用来计算CRC32的代码:
lib::crc_32_type result;
std::vector<uint32_t> payload = frame->payload();
// We have a function that can take a vector<uint32_t> and pass it off to boost::crc_32_type
result(payload);
printf("crc = %08u",result.checksum());
解决方法
我找到了解决问题的答案。我发布此消息是为了防止有人遇到与我相同的问题。
根据帧头+有效负载来计算光纤通道帧的CRC。在将数据传递给boost :: crc_32_type进行计算之前,必须确保帧头和有效负载都存储在big endian中。以下是我的工作:
htmlspecialchars_decode("_",ENT_NOQUOTES);
,
进行网络搜索时,似乎CRC多项式为CRC32:
X^32 + X^26 + X^23 + X^22 + X^16 + X^12 + X^11 + X^10 + X^8 + X^7 + X^5 + X^4 + X^2 + X + 1
十六进制0x104C11DB7,对于这种情况,对于反射的CRC,十六进制0xEDB88320
反映了CRC计算(每个数据字节首先处理最低有效位。我建议从此在线计算器中以CRC32开头: