char指针位运算代码咨询:解析long int字段的实现逻辑
代码解析:从字节流解包结构体
这段代码的核心功能是从文件中读取7字节数据,手动将这些字节解析到自定义结构体中,处理的是大端字节序(高位字节在前)的数据。
整体流程概述
- 定义结构体
mystruct:包含1字节字符c、4字节长整型i32、2字节整型i16,总大小刚好7字节。 - 通过
fread从文件指针fp读取7字节到缓冲区buf。 - 用无符号字符指针
p遍历缓冲区,逐个字节解析到结构体成员中。
重点解析:长整型i32的构造逻辑
这段代码把4个连续字节拼接成32位长整型,每一步的作用如下:
s.i32 = (long)*p++ << 24;
- 取当前指针
p指向的无符号字节,强制转换为long类型(避免移位时的溢出问题)。 - 左移24位:将该字节放到32位长整型的最高8位(第24-31位)。
p++:指针后移,指向下一个字节。
s.i32 |= (long)*p++ << 16;
- 取下一个字节,转成
long后左移16位,放到长整型的次高8位(第16-23位)。 - 用
|=(按位或)操作,将这部分数据合并到已有的i32值中。 - 指针再次后移。
s.i32 |= (unsigned)(*p++ << 8);
- 取第三个字节,左移8位后放到长整型的中间8位(第8-15位)。
- 强制转换为
unsigned是为了防止符号扩展:如果当前字节最高位是1,若以有符号类型处理,移位后高位会填充1导致数值错误;转为无符号类型可确保高位填充0,保证数值正确。 - 按位或合并到
i32,指针后移。
s.i32 |= *p++;
- 取第四个字节,直接放到长整型的最低8位(第0-7位)。
- 按位或完成整个32位整数的拼接,指针后移。
补充:i16的构造逻辑
s.i16 = *p++ << 8; s.i16 |= *p++;
和i32逻辑一致,将2个字节拼接成16位整型,遵循大端字节序:第一个字节为高8位,第二个为低8位。
内容的提问来源于stack exchange,提问作者Ajay N
相关产品推荐
相关产品推荐

