免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3804 | 回复: 5
打印 上一主题 下一主题

[C++] 关于结构体内数据 在内存中左对齐改为右对齐 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-05 18:24 |只看该作者 |倒序浏览
把问题描述清楚 再修改一下 ....

A 方   linux + g++3    发送结构体数据
struct Data
{
    char A[26];
    char B[26];
    unsigned long time;
    unsigned long count;
}

B方   win2000+ vc  接收结构体数据
--------------------------------------------------------------------------------
A发送的数据在A方端口出抓出 内存中的排列为:
32 33 38 30 31 33 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
32 33 36 32 37 31 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
15 75 09 49
02 00 00 00

B方在本地端口处抓得数据包 经确认与A所抓一致
--------------------------------------------------------------------------------
dev c++开发的模拟B接收的程序代码  可以按照左对齐读取 数据接收OK
               char temp[61];
               int iRet = recv(m_sockfd, temp, 60, 0);
               fd << ((Data *)temp)->A;
               fd << ((Data *)temp)->B;
               fd << ((Data *)temp)->time;
               fd << ((Data *)temp)->count;

B方接收处的实际接收代码   struct Data  = strcut ReceiveSMBody
        buflen = Receive(body, MAX_PACKET_LEN);

        ReceiveSMBody receivedata;
        memcpy(&receivedata, body, sizeof(ReceiveSMBody));

        char                A[32] ;       
        char                B[32] ;       
        unsigned long        time;       
        unsigned long        count;       

        sprintf(A,receivedata.A);
        sprintf(B,receivedata.B);
        time = receivedata.time;
        count= receivedata.count;


---------------------------------------------------------------------------------

然后B方接收时是按照右对齐接收(B说的), 反映数据接收不正常
我觉得如果是有问题的话 应该的是编译器的差异造成的

请问 如果不专门写函数处理的话 A方是否有相关的编译器参数 是真实数值在内存中右对齐
谢谢.......

还是只需要完成 big endian到little endian的转换就ok  正在尝试...
(字符串右对齐之后 我的模拟程序接收到两个字符数组打印结果为空,想也是必然...首字母为0)

暂时的解决方法 是 A发送前 sprintf( Data .A, "%25s", A);         

很大怀疑 自己是被人玩了 ):

[ 本帖最后由 senic 于 2008-11-6 00:25 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-05 18:36 |只看该作者
linux 是rh 7.2

我在本机上 用dev c++模拟的接收程序 是可以按照做对齐读取的

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
3 [报告]
发表于 2008-11-05 19:31 |只看该作者

回复 #1 senic 的帖子

不懂啊
友情帮顶下。

论坛徽章:
0
4 [报告]
发表于 2008-11-05 23:54 |只看该作者
[quote]原帖由 senic 于 2008-11-5 18:24 发表


然后B方接收时是按照右对齐接收 ,我觉得应该的是编译器的差异造成的

这个,排除大端和小端的区别,C标准是规定每个结构的字段必须按照定义的顺序排列。但是没有强制规定每一个类型的长度。
同时每个字段还要考虑到对齐。所以你最好不要假设不同的编译器对同一结构的定义的处理会完全相同。

你说的在A方端口抓数据是指网络的传输数据吗?据说网络协议中传的数据都是小端(跟INTEL处理相反)。不知你说的不一致是在哪个层面。
如果是网络传输的数据大小端跟编译器接受的大小端不同的话,应该是没有问题的。如果是两个机器上的编译器接受的数据大小端不一致的话,那估计只能自己写函数处理一下了。

论坛徽章:
0
5 [报告]
发表于 2008-11-06 00:27 |只看该作者
恩啊 以前在类似开发环境里开发的程序 根本就不存在 linux->window socket 结构体内字符串要右对齐........

论坛徽章:
0
6 [报告]
发表于 2008-11-06 08:57 |只看该作者
这种情况,要对齐,大家都约定好,几字节对齐,对不齐的手动对齐(加上reserve位)。否则会经常出现问题。

当然大小端也要考虑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP