2014-04-02 41 views
2

我有一个特定大小的字节数组。我想抓住它的最后四个字节,并把它们放在一起,在变量中形成一个四字节的十六进制值。这样我可以将一个四字节的CRC-32值与我的变量进行比较,并检查CRC值是否相同。 现在,这是我如何在目前这样做:我可以通过更好的数组操作来优化此代码吗?

static unsigned long whole_four = 0; // This variable holds the last four bytes of the received bytes which are the CRC bytes 

//Note that "MAX_INPUT" is the size of my array and "data" is just a pointer I have used as an argument to a function to point to the elements a buffer array. 

whole_four = ((unsigned long)(*(data+(MAX_INPUT-4)))<< 24) | ((unsigned long)(*(data+(MAX_INPUT-3)))<< 16) | ((unsigned long)(*(data+(MAX_INPUT-2)))<< 8) | ((unsigned long)(*(data+(MAX_INPUT-1)))); 

所以你可以看到我在移动和“或”荷兰国际集团我的数组的最后四个元素构成一个四个字节变量。 现在,我的问题是: 有没有更快的方法来实现这一点,并减少所需的处理能力? 我也想提一下,我正在Arduino Uno上编译此代码。 任何帮助或提示是非常感谢。

回答

0

如果字节序是不是一个问题(如伊夫说:如果两个CRC的要比较也能得到相同的方式),你可以尝试使用:

memcpy(&whole_four, data + MAX_INPUT - 4, sizeof(whole_four)); 

现代编译考虑到数据类型对齐(字符数组不一定具有正确的对齐方式)/处理器,将内联该调用以适应您的情况。

PS memcpy将解释的data与主机系统字节顺序(小端)字节,而你的方法从data以big-endian顺序解释字节。

因此,memcpy只有在可以以相同格式获取其他比较期限时才有效。

+0

所以为了澄清,你们认为可能创建一个循环来使用memcpy将4个CRC字节放在“whole_four”中,比移位和“或”字节更快吗? – user3397830

+0

我不知道它是否更快,但它很简单,你可以试试看。编译器通常会将memcpy与高度优化的特定于平台的代码“内联”。在这种情况下,要在编译时知道要复制的字节数,编译器可以将其编译为单个加载/存储。 – manlio

0

*(unsigned long*)(data + MAX_INPUT - 4)将一次取出四个字节。根据印度,这可以给你两个不同的结果。但是如果两个CRC的比较都是以同样的方式获得的,那没关系。