我可以通过更好的数组操作来优化此代码吗?

时间:2014-04-02 06:28:38

标签: c arrays optimization arduino-uno

我有一个特定大小的字节数组。我想抓住它的最后四个字节并将它们放在一起,在变量中形成一个四字节十六进制值。这样我可以将四字节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上编译这段代码。 任何帮助或提示都非常感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果字符串不是问题(正如Yves所说如果要比较的两个CRC ),那么你可以尝试:

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

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

PS memcpy将使用主机系统字节顺序(小端)解释data的字节,而您的方法以大端顺序解释来自data的字节。

因此,只有在您能够以相同格式获得其他比较术语时,才能使用memcpy。