2 qq 33460068 qq_33460068 于 2017.09.14 20:36 提问

将16进制数据写入结构体时,遇到double型出错

我定义了一个结构体
struct RAW
{
int size;
double time;
int size2;
char name;
}PingHeader;
想用结构体对齐,直接读取到PingHeader中。
infile.read((char*)&PingHeader,sizeof(PingHeader));
但是转换成double是就会出错,当把double注释掉是就可以按照类型大小一一次赋值了。是在搞不懂了,希望大哥指点指点

2个回答

qq_28249373
qq_28249373   2017.09.14 21:29
已采纳

结构体有有字节对齐,因此,sizeof(PingHeader)=24,大于结构体各成员宽度之和(17),字节是不对应的。int size 从第一个字节开始到第四个字节,第五个字节到第八个字节是空的,double time事实上是从第9个字节开始的,而不是从第5个字节开始。结构体的字节对齐,默认是以最大的成员字节数为基准,比如,你这里的字节对齐就是8字节。当然,你可以自己设定结构体字节对齐值,如果设置字节对齐为1字节的话,sizeof(PingHeader)就等于17了。修改方法是:在程序开头加上预处理命令#pragma pack(1)。想了解更多结构占用空间大小,可以参考http://blog.csdn.net/qq_28249373/article/details/76784475

qq_33460068
qq_33460068 对了,谢谢您,你帮了我大忙,
2 个月之前 回复
what951006
what951006   Rxr 2017.09.14 21:21

name确定是1个字节?还有就是写入的确定正确?好像你是从文件里读取的

Csdn user default icon
上传中...
上传图片
插入图片