前几天我正在查看哈希函数,并遇到了一个有一个例子的网站。大多数代码都很容易掌握,但是这个宏函数我无法真正理解。
有人可以分解这里发生的事情吗?
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))
答案 0 :(得分:1)
宏或多或少等同于:
static uint32_t get16bits(SOMETYPE *d)
{
unsigned char temp[ sizeof *d];
uint32_t val;
memcpy(temp, d, sizeof *d);
val = (temp[0] << 8)
+ temp[1];
return val;
}
,但宏参数没有类型,函数参数也没有。
另一种方式是实际投射:
static uint32_t get16bits(SOMETYPE *d)
{
unsigned char *cp = (unsigned char*) d;
uint32_t val;
val = (cp[0] << 8)
+ cp[1];
return val;
}
,它也显示了弱点:通过索引为1,代码假定sizeof(* d)至少为2.
答案 1 :(得分:1)
基本上它得到32位整数d的低16位
让我们分解
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))
uint32_t a = 0x12345678;
uint16_t b = get16bits(&a); // b == 0x00005678
首先我们必须将a的地址传递给get16bits()
,否则它将无效。
(((uint32_t)(const uint8_t *)(d))[1])) << 8
这首先将32位整数转换为8位整数数组并检索2位整数。 然后它将值移位8位,然后将低8位加到
+ (uint32_t)(((const uint8_t *)(d))[0]))
在我们的示例中,它将是
uint8_t tmp[4] = (uint8_t *)&a;
uint32_t result;
result = tmp[1] << 8; // 0x00005600
result += tmp[0]; //tmp[0] == 0x78
// result is now 0x00005678