网络传输或写磁盘struct问题

写磁盘时应该注意:


(引自短歌老大)直接fwrite并非不可以,只是可移植性太差。一般我们把数据写入文件都是为了进行数据交换,而直接把一个结构体用一次fwrite调用写入文件后是否可以再用一次fread正确读出取决于写入代码和读出代码编译时的字长、对齐逻辑和字节序等问题(这句话长点,大家凑合着看),严重影响可移植性。 

把一个结构体写入文件时我觉得要注意以下几点: 
1:要按不同域分别写入,以避免对齐方式的影响; 
2:要设计好不同数据的长度,不要用sizeof来获得,以避免字长的影响; 
3:要设计好字节顺序,每次写入一个字节,以避免 字节序的影响; 
4:要存储逻辑结构而不是数据结构。比如当存储链表时按顺序存储数据读取时再重新组织为链表,而不要去考虑如何存储链接域。 


写入网络好说了:

 

1)首先要清楚是否有机器位宽不一致的情况,如32位机和64位机。如果位宽不一致,则避免传输表示方 式 不一致的数据类型,如long、float型在32位了64位下表示方式不一致,会导致数据解析错误。

2)确认通信双方的对齐位宽一致,或自己保证传输的数据结构在对齐调整后不会产生大小不一致。如果收发 双方的对齐方式分别是按4和8字节对齐,则需要在程序中明确制定对齐位宽;或者调整数据的结构,确保在 对齐调整后,收/发的数据中每一项的偏移量一致。
3)尽量对发出去的数据都转换成网络字节序,接收后转换回本地字节序,特别是机器字节序不一致时,现有 的字节序转换函数不能满足所有需求。
4)某些数据类型的表示方式有不同,如浮点数(一般用IEEE 794标准),不能认为正确的传了一个字节序 正确的8字节double型就对了,不同平台对double型的表示方式不同,比如发送1.003,接受没问题,结果却 得到了其它的数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值