我有一个特定大小的字节数组。我想捕获它的最后四个字节并将它们并排放置以在一个变量中形成一个四字节的十六进制值。这样我就可以将一个四字节的 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 上编译这段代码。 非常感谢任何帮助或提示。
最佳答案
如果字节顺序不是问题(正如 Yves 所说如果要比较的两个 CRC 以相同的方式获得),您可以尝试:
memcpy(&whole_four, data + MAX_INPUT - 4, sizeof(whole_four));
考虑到数据类型对齐(char 数组不一定具有正确对齐)/处理器,现代编译器会将此调用内联到非常适合您的情况的内容。
PS memcpy
将使用主机系统字节顺序(小端)解释 data
的字节,而您的方法解释来自 data
的字节> 按大端顺序。
所以 memcpy 只有在你能以相同的格式获得另一个比较项时才会起作用。
关于我可以通过更好的数组操作来优化此代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803170/