c语言结构体强转后数据不对

SanLenoTwo 2019-08-08 09:28:27
在工作中遇到如下问题,望各位大侠解答一下不胜感激。
typedef struct _PICTURE_PKT_TAG_
{
UINT8 isLastPkt; //是否是最后一个包
UINT8 pktLength; //数据包长度 最大包长255字节
UINT32 curPktNum; //当前包序号
UINT32 nextPktNum; //下一个包序号
UINT8 *picData; //包数据
}picturePkt; //单字节对齐

代码段:
picturePkt picTmp;

picTmp.isLastPkt = isLastPkt;
picTmp.pktLength = ret;
picTmp.curPktNum = curPktNum;
picTmp.nextPktNum = nextPktNum;
picTmp.picData = pktBuff;

UINT8 *picBuff = (UINT8 *)&picTmp;
//强转之后的数据有问题
i=0 buf=0
i=1 buf=36
i=2 buf=0
i=3 buf=0
i=4 buf=0
i=5 buf=0
i=6 buf=1
i=7 buf=0
i=8 buf=0
i=9 buf=0

i=10 buf=6c
i=11 buf=ff
i=12 buf=7f
i=13 buf=2

i=14 buf=ff
i=15 buf=d8
i=16 buf=ff
i=17 buf=e0

请问i=10 buf=6c ------ i=13 buf=2这段数据是怎么来的,我看了一下这四个数据组合之后的值27fff6c是pktBuff的地址,应该如何去理解。
...全文
925 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
柳鲲鹏 2019-08-18
  • 打赏
  • 举报
回复
应该叫造型,这样才标准
qq_36843259 2019-08-16
  • 打赏
  • 举报
回复
尽量应该传字符串,尽量避免传结构体
shauew 2019-08-13
  • 打赏
  • 举报
回复
结构体内存对齐问题 实战中不是会遇到这个问题吗?
轻箬笠 2019-08-12
  • 打赏
  • 举报
回复
引用 10 楼 轻箬笠 的回复:
前几天刚碰到类似的问题。
楼主把UINT8 *picData;换成UINT8 picData[0];试试

引用 11 楼 SanLenoTwo 的回复:
picTmp.picData = pktBuff; 换成UINT8 picData[0]之后就无法进行赋值操作了。

楼主换个思维啊。
char buf[4096] = {0};
picturePkt *pkt = (picturePkt *)buf;
memcpy((void *)picTmp.picData, (void *)pktBuff, len);
send(buf);
gouyanfen 2019-08-08
  • 打赏
  • 举报
回复
typedef struct _PICTURE_PKT_TAG_ { UINT8 isLastPkt; //是否是最后一个包 0 UINT8 pktLength; //数据包长度 最大包长255字节 1 UINT32 curPktNum; //当前包序号 2 3 4 5 UINT32 nextPktNum; //下一个包序号 6 7 8 9 UINT8 *picData; //包数据 10 11 12 13 }picturePkt; //单字节对齐 UINT8 占1个字节 UINT32占四字节 UINT8 * picData 是个指针,这个指针地址,你给他赋值picTmp.picData = pktBuff; 你让他指向了pktBuff,你问别人为什么
尐东东 2019-08-08
  • 打赏
  • 举报
回复
UINT8 * 是一个指针类型,32位系统占用4个字节。 picData = pktBuff = 0x027fff6c; 强转成UINT8 之后变为四个字节,分别为 02 7f ff 6c
赵4老师 2019-08-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("AD sizeof %d\n", sizeof(AD));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("A1 sizeof %d\n", sizeof(A1));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("A2 sizeof %d\n", sizeof(A2));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("A4 sizeof %d\n", sizeof(A4));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("A8 sizeof %d\n", sizeof(A8));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("A16 sizeof %d\n", sizeof(A16));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//
自信男孩 2019-08-08
  • 打赏
  • 举报
回复
引用 2 楼 SanLenoTwo 的回复:
谢谢,大小端是决定了数据的存放位置。我想知道
i=10 buf=6c
i=11 buf=ff
i=12 buf=7f
i=13 buf=2
这几个数据是怎么来的。


你看一下
i=8 buf=0
i=9 buf=0

i=10 buf=6c
i=11 buf=ff
这几个值合起来是:nextPktNum,
i=12 buf=7f
i=13 buf=2

i=14 buf=ff
i=15 buf=d8
这几个合起来是:picData
lin5161678 2019-08-08
  • 打赏
  • 举报
回复
百度搜索 内存对齐 现在上课不教这个吗?
SanLenoTwo 2019-08-08
  • 打赏
  • 举报
回复
谢谢,大小端是决定了数据的存放位置。我想知道 i=10 buf=6c i=11 buf=ff i=12 buf=7f i=13 buf=2 这几个数据是怎么来的。
自信男孩 2019-08-08
  • 打赏
  • 举报
回复
注意你的系统是小端系统还是大端系统,一般我们用的都是小端系统,小端系统遵循高对高,低对低,即高地址存放高字节,
低地址存放低字节。

大端系统正好相反,“高对地,低对高”
gouyanfen 2019-08-08
  • 打赏
  • 举报
回复
引用 9 楼 SanLenoTwo 的回复:
因为要将picTmp数据发送出去,所以必须一个字节一个字节的取出来。picTmp.picData = pktBuff;本身没错,因为直接picTmp.picData[0]这种方式得到的数据是对的,强转之后数据就不对了。我的理解是数组的地址赋给了picTmp.picData强转之后直接访问就可以了,但是看来首先得到的是指针地址占据的四个字节。
你要发送消息就直接定义无属性的空间,把你要发送的按字节填充进去,你怎么强转都是没有用的。你想直接发结构,需要把结构序列化
SanLenoTwo 2019-08-08
  • 打赏
  • 举报
回复
picTmp.picData = pktBuff; 换成UINT8 picData[0]之后就无法进行赋值操作了。
轻箬笠 2019-08-08
  • 打赏
  • 举报
回复
前几天刚碰到类似的问题。
楼主把UINT8 *picData;换成UINT8 picData[0];试试
SanLenoTwo 2019-08-08
  • 打赏
  • 举报
回复
因为要将picTmp数据发送出去,所以必须一个字节一个字节的取出来。picTmp.picData = pktBuff;本身没错,因为直接picTmp.picData[0]这种方式得到的数据是对的,强转之后数据就不对了。我的理解是数组的地址赋给了picTmp.picData强转之后直接访问就可以了,但是看来首先得到的是指针地址占据的四个字节。
gouyanfen 2019-08-08
  • 打赏
  • 举报
回复
引用 楼主 SanLenoTwo 的回复:
在工作中遇到如下问题,望各位大侠解答一下不胜感激。 typedef struct _PICTURE_PKT_TAG_ { UINT8 isLastPkt; //是否是最后一个包 UINT8 pktLength; //数据包长度 最大包长255字节 UINT32 curPktNum; //当前包序号 UINT32 nextPktNum; //下一个包序号 UINT8 *picData; //包数据 }picturePkt; //单字节对齐 代码段: picturePkt picTmp; picTmp.isLastPkt = isLastPkt; picTmp.pktLength = ret; picTmp.curPktNum = curPktNum; picTmp.nextPktNum = nextPktNum; picTmp.picData = pktBuff; UINT8 *picBuff = (UINT8 *)&picTmp; //强转之后的数据有问题 i=0 buf=0 i=1 buf=36 i=2 buf=0 i=3 buf=0 i=4 buf=0 i=5 buf=0 i=6 buf=1 i=7 buf=0 i=8 buf=0 i=9 buf=0 i=10 buf=6c i=11 buf=ff i=12 buf=7f i=13 buf=2 i=14 buf=ff i=15 buf=d8 i=16 buf=ff i=17 buf=e0 请问i=10 buf=6c ------ i=13 buf=2这段数据是怎么来的,我看了一下这四个数据组合之后的值27fff6c是pktBuff的地址,应该如何去理解。
你后面的指定应该这样定义的 picturePkt* picBuff = &picTmp; 完全没必要强转成指向UINT8 类型的指针

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧