ixlsmile 2024-03-15 20:19 采纳率: 66.7%
浏览 5
已结题

结构3个byte与4个byte对齐问题

这是在做24bit与32bit转换的问题。

定义:
我不会用结构控件,发不了,上图好了。

img

结构 {
char l;
char m;
char h;
} x24;

结构 {
char l;
char m;
char h;
char n;
} x32;

测试代码:

main(){
x24 x1;
x32 x2;

… 赋值
//假设内存在x1位置的连续4个byte是
// AA BB CC DD
//假设内存在x2位置的连续4个byte是
// 11 22 33 44

x32 = (x32)x24;

}

我希望的结果是x2.n为0
也就是x2内存要变成 AA BB CC 00
相当于数字运算

实际上的结果是x2.n=(((x32)&x1)).n
x2内存变成了 AA BB CC DD
等于x1的形态先变成了x32,再将4个byte复制到x2

多写几行代码或是用#define当然可以实现,
但代码撰写就比较麻烦,不能用等号=

如何定义结构,才能让x24变成x32的型态,
再用0补充到没用到的空间呢?

  • 写回答

4条回答 默认 最新

  • 关注

    ixlsmile 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据你的描述,你想要将一个由3个byte组成的结构体转换为一个由4个byte组成的结构体,并且希望未使用的最后一个byte填充为0。以下是一个解决方案:

    1. 定义结构体 x24,代表3个byte组成的结构体:
    struct x24 {
      char l;
      char m;
      char h;
    };
    
    1. 定义结构体 x32,代表4个byte组成的结构体:
    struct x32 {
      char l;
      char m;
      char h;
      char n;
    };
    
    1. 在进行类型转换之前,先创建一个新的 x32结构体对象 temp,并将其内存清零:
    x32 temp;
    memset(&temp, 0, sizeof(x32));
    
    1. 进行类型转换,将 x24的值复制到 temp中:
    temp.l = x1.l;
    temp.m = x1.m;
    temp.h = x1.h;
    

    现在,temp结构体对象中的前3个byte将包含与 x1中相同的值,而最后一个byte将被填充为0。

    1. temp赋值给 x2
    x2 = temp;
    

    这样,你应该得到了你期望的结果,x2.n的值为0。

    以下是修改后的完整代码示例:

    #include <stdio.h>
    #include <string.h>
    
    struct x24 {
      char l;
      char m;
      char h;
    };
    
    struct x32 {
      char l;
      char m;
      char h;
      char n;
    };
    
    int main() {
      struct x24 x1;
      struct x32 x2;
    
      // 假设内存在x1位置的连续4个byte是
      // AA BB CC
      // 假设内存在x2位置的连续4个byte是
      // 11 22 33 44
      x1.l = 0xAA;
      x1.m = 0xBB;
      x1.h = 0xCC;
    
      struct x32 temp;
      memset(&temp, 0, sizeof(struct x32));
    
      temp.l = x1.l;
      temp.m = x1.m;
      temp.h = x1.h;
    
      x2 = temp;
    
      printf("%02X %02X %02X %02X\n", x2.l, x2.m, x2.h, x2.n);
    
      return 0;
    }
    

    输出结果将是:

    AA BB CC 00
    

    这样,你成功将一个由3个字节组成的结构体转换为一个由4个字节组成的结构体,并且填充未使用的最后一个字节为0。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月10日
  • 已采纳回答 5月2日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见