首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在二进制数组(0和1的数组)中使用boost::crc_optimal

如何在二进制数组(0和1的数组)中使用boost::crc_optimal
EN

Stack Overflow用户
提问于 2014-12-07 15:39:43
回答 1查看 970关注 0票数 0

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

代码语言:javascript
复制
// 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 data [] = {1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0};

如何将crc_optimal应用于此序列?

我应该只转换每个0到0x30和每个1到0x31吗?在这种情况下,如何将结果crc恢复为二进制形式?

谢谢。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-07 16:02:19

要使用逐字节的CRC例程,您需要将您的位序列转换为字节序列。比特的顺序取决于CRC的顺序,在这种情况下(CCITT-false)没有反映出来,所以您首先认为比特流是最重要的位。然后,您的序列的前八位变成0x85。如果它是一个反射CRC (例如真正的CCITT 16位CRC),那么前八位变成0xa1。

如果如示例所示,位数不是8的倍数,那么您需要编写自己的CRC例程来处理剩下的1到7位。对于CCITT-false,在这种情况下,一个稍微明智的CRC应该是如下所示,其中bit是转换为整数0或1的浮点数:

代码语言:javascript
复制
crc = ((bit << 15) ^ crc) & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
// ... repeat for remaining bits ...
crc &= 0xffff;

如果这是真正的CCITT 16位CRC,它的初始化值为零,您可以做一些不同的事情来处理额外的比特。在这种情况下,可以将足够多的零添加到流的前面,使其为8的倍数。初始化为零的前导零使CRC保持为零。因此,对于CCITT 16,它反映了,你的17位数据变成了0x800x500x00

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27344322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档