c++ - 了解类型转换(指针)

标签 c++ c

我正在阅读 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/

相关文章:

c++ - QPointer::clear() 是否删除其引用的指针,或者 "Clears this QPointer object."是否有其他含义?

c++ - 跟踪光标 C++

c - 在动态数组上使用 strcpy

c++ - fread 时在 C 中转换 float -> double 的问题

C:带有 void 指针的可变参数函数

c - 关于在 C 中获取用户输入的查询

c++ - 为什么static_cast转换无效?

c# - 确保一次最多运行一个进程

c# - WPF 控件中的 native Win32 窗口

c - 在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵