我有一个特定大小的字节数组。我想抓住它的最后四个字节并将它们放在一起,在变量中形成一个四字节十六进制值。这样我可以将四字节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 :(得分: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。