我想比较 2 个十六进制的无符号字节。这是我尝试过的:
if (memcmp (msgType , 0x00003336, 2 ) == 0){}
这是 gcc 为 msgType 打印的内容:
(gdb) x msgType
0x7fffffffbb84: 0x00003336
我有段错误。我该如何解决它?
编辑:
我试过了:
const unsigned char broadcast[2] = {0x33, 0x36};
但 gdb 显示:
(gdb) x broadcast
0x401e28 <broadcast>: 0x62723633
我需要:0x00003336
memcmp()
的前两个参数是指向要比较的内存块的指针。参见手册页,原型是:
int memcmp(const void *s1, const void *s2, size_t n);
您使用绝对地址0x00003336作为s2
的值,这似乎非常错误;在一般情况下,这不是一个有效的地址。
若要解决此问题,必须创建一个内存区域来保存要比较的值,并将指向该值的指针作为第二个参数传递。尝试:
const uint8_t data[] = { 0x36, 0x33 };
if(memcmp(msgType, data, sizeof data) == 0)
{
}
请注意,在上面交换的字节是假设您使用的是小端系统。
一个指针作为第二个参数,你不能只在那里传递一个十六进制值
http://www.cplusplus.com/reference/cstring/memcmp/
可能有效的东西:
#include <stdio.h>
int main(void) {
unsigned char msgType[2] = {0x33, 0x36};
unsigned char your_value[2] = {0x33, 0x36};
// Make sure your_value is the same size of msgType
if (memcmp (msgType , your_value, sizeof(msgType)/sizeof(unsigned char) ) == 0){
printf("Yes, memory is equal at that address!");
}
return 0;
}
http://ideone.com/EQH6py
如果你的进程不拥有0x00003336
的内存,那么你将得到未定义的行为:在这个特定实例中,表现为段错误。
这里要做的正常事情是将指针传递给您自己实例化的变量。
memcmp()
的前两个参数都必须是指向内存的指针。您似乎正在传入要比较的值,而不是指向该值的指针。
相反,请尝试以下操作:
unsigned short expectedValue = 0x3336;
if (memcmp (msgType, &expectedValue, 2) == 0){}