`

网络传输或写磁盘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,接受没问题,结果却 得到了其它的数值。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics