c++ - 如何将 boost::crc_optimal 与二进制数组一起使用(0's and 1' s 的数组)

标签 c++ boost binary crc

我需要使用 boost::crc_optimal ,它计算数组(字符?)的 crc。 使用示例:

// This is "123456789" in ASCII
unsigned char const  data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };
std::size_t const    data_len = sizeof( data ) / sizeof( data[0] );

// The expected CRC for the given data
boost::uint16_t const  expected = 0x29B1;
boost::crc_optimal<16, 0x1021, 0xFFFF, 0, false, false>  crc_ccitt2;
crc_ccitt2 = std::for_each( data, data + data_len, crc_ccitt2 );
assert( crc_ccitt2() == expected );

问题是我正在处理的数据是一系列 0 和 1。具体例子:

int 数据 [] = {1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};

如何将 crc_optimal 应用于此序列?

我应该只将每个 0 转换为 0x30 并将每个 1 转换为 0x31 吗?在那种情况下,如何将生成的 crc 恢复为二进制形式?

谢谢。

编辑:将数组类型从 float 更改为 int,因为这不是必要的部分。 看起来挑战在于我正在处理长度不是 8 的倍数的数组。

最佳答案

要使用按字节的 CRC 例程,您需要将位序列转换为字节序列。位的顺序取决于 CRC 的顺序,在这种情况下 (CCITT-false) 未反射(reflect)出来,因此您认为位流首先是最高有效位。然后序列的前八位变为 0x85。如果它是反射 CRC(例如真正的 CCITT 16 位 CRC),则前八位变为 0xa1。

如果如示例所示,位数不是八的倍数,则您需要编写自己的 CRC 例程来处理剩余的一到七位。在这种情况下,对于 CCITT-false,逐位 CRC 看起来像下面的 CCITT-false,其中 bit 是转换为整数 0 或 1 的浮点值:

crc = ((bit << 15) ^ crc) & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
// ... repeat for remaining bits ...
crc &= 0xffff;

如果这是具有零初始化值的真正的 CCITT 16 位 CRC,您可以做一些不同的事情来处理额外的位。在这种情况下,您可以将足够多的零附加到流的前面,使其成为八的倍数。零初始化的前导零使 CRC 为零。所以对于反射(reflect)出来的CCITT CRC-16,你的17位数据变成了0x80, 0x50, 0x00

关于c++ - 如何将 boost::crc_optimal 与二进制数组一起使用(0's and 1' s 的数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344322/

相关文章:

c++ - 简单的 g++ 内联汇编程序出错

c++ - boost::make_shared 导致访问冲突

binary - Lua:将整数打印为二进制

C++ - 十进制到二进制转换

C++遍历列表以比较位置

c++ - mavericks/xcode5.0.1 是如何改变编译器和链接器的?

c++ - 我应该从以下功能中选择什么

c++ - 使用 UTF-8 在非 ASCII 字符上运行 Ascii 正则表达式

c++ - 从 boost::multi_index 获取值

javascript - 如何使用 Javascript 从现有音频元素获取 Blob 数据