我已经得到了一个任务,从 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 p it off to boost::crc_32_type
result(payload);
printf("crc = %08u", result.checksum());
我发现了我的问题的答案。我发布了这个,以防任何人遇到与我相同的问题。
光纤通道帧的 CRC 是根据帧头 + 有效负载计算的。在将数据传递给 boost::crc_32_type 进行计算之前,必须确保帧头和有效负载都存储在大端中。下面是我所做的:
#include <boost/crc.hpp>
someLibrary::crc_32_type crc;
FibreChannelFrameObject frame;
FrameHeader fh = frame.header();
std::vector<uint_32> hdr_payload, payload = frame.payload();
// Add entire frame header to hdr_payload
hdr_payload.push_back(fh.word0);
hdr_payload.push_back(fh.word1);
hdr_payload.push_back(fh.word2);
hdr_payload.push_back(fh.word3);
hdr_payload.push_back(fh.word4);
hdr_payload.push_back(fh.word5);
for(auto i = payload.begin(); i != payload.end(); ++i)
{
hdr_payload.push_back(be32toh(*i));
}
// I have some function that can take in a std::vector<uint32_t> and send it to boost::crc_32_type for calculation
crc(hdr_payload);
printf("crc() = %08u", crc.checksum());
做一个网络搜索,似乎 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 开始:
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(31条)