我正在阅读 Beej 的《网络编程指南》一书,但我无法理解某个函数。该函数需要一个 char * 指针,但它取消引用该指针并将其转换为 (unsigned long int) 并执行一些按位操作。为什么我们不能将它作为
(unsigned int *)
而不是 (unsigned char *)
。另外,如果参数被 (void *)
替换,然后在代码中我们做了一些类似的事情:
*(unsigned long int *)buf[0] << 24
我们会得到相同的结果吗? (抱歉,这是我第一次在这里提问,所以如果需要更多信息,请告诉我)。
unsigned long int unpacku32(unsigned char *buf)
{
return ((unsigned long int)buf[0]<<24) |
((unsigned long int)buf[1]<<16) |
((unsigned long int)buf[2]<< 8) |
buf[3];
}
最佳答案
您的建议并不保证有效。除非 buf
指向实际的 unsigned long
,否则您将尝试将一种类型的对象读取为另一种类型的对象,这是不允许的(除非您读取为 >无符号字符
)。如果您创建的指针值未与其类型正确对齐,则可能会出现进一步的问题。
还有字节序的问题。通过网络发送的字节通常以大端格式发送,即首先发送最高有效字节。如果您的系统是小尾数法,它将以相反的顺序解释字节。
您发布的函数演示了以符合标准的方式从字节缓冲区反序列化 unsigned long
的正确方法。
关于c++ - 了解类型转换(指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737183/