CC++跨平台IO操作技巧
如果您正在编写从文件或网络中读写数据的跨平台C/C++代码,那么您必须明白,由于语言、编译器和平台的不同,有些问题是不同的。主要问题是数据对齐、填充、类型大小、字节顺序以及默认状态字符是否有符号。
排列
在特定的机器上,特定的数据与特定的边界对齐。如果数据没有正确对齐,结果可能是效率低下甚至崩溃。当您从I/O源读取数据时,请确保对齐正确。
填充
“填充”是数据集中不同元素之间的间隔,它通常是为了对齐而存在的。填充的数量可能因编译器和平台而异。?不要假设结构的大小和成员的位置在任何编译器和平台中都是一样的。不要一次读取或写入整个结构,因为写入的程序可能使用与读取的程序不同的填充方法。这同样适用于域。
字体大小
不同数据类型的大小因编译器和平台而异。在C/C++中,内置类型的大小完全取决于编译器(在特定范围内)。不要读取或写入大小不明确的数据类型。也就是说,不要读写bool、enum、long、int、short、float、double类型。(译者注:好像不是这样。我记得C/C++标准规定了一些数据类型的长度,比如短2字节,长4字节等。在符合标准的编译器上,使用这些类型可以保证跨平台的正确性。)
把这些换成这些。...
int8,uint8字符,有符号字符,无符号字符,枚举,布尔值
int16,uint16 short,有符号short,无符号short,enum
int32,uint32 int,有符号int,无符号int,long,有符号long,无符号long,enum
int64,uint64 long,有符号long,无符号long
int128,uint128 long long,有符号long long,无符号long long
浮子32浮子
Float64双
字节顺序
字节顺序是字节在内存中存储的顺序。不同的处理器以不同的顺序存储多字节数据。小处理器从低到高存储(换句话说,按照写的相反顺序)。大处理器从高到低存储(和写的顺序一样)。如果值的字节顺序与读写它的处理器不同,则必须提前转换。同时,为了规范网络传输的字节顺序,定义了网络字节顺序。
带符号还是不带符号?
一个鲜为人知的事实是,默认情况下,char可以是有符号的,也可以是无符号的——这完全取决于编译器。因此,当您从char转换为其他类型(如int)时,编译器之间的结果会有所不同。例如:
char x;
int y;
read( fd,&x,1);//读取值为0xff的字节
y = x;// y是255或-1,取决于编译器
不要将数据读入通用字符。指定它是已签名的还是未签名的。
位律师回复
0条评论