You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:45:42