如何以长度指示器的方式正确读取二进制文件?我正在做这样的事情,但它一直给我奇怪的结果:
size_t len;
string stuff;
stream.read ((char *)&len, sizeof(size_t));
stream.read ((char *)&stuff, len);
我是这样写的:
ostringstream temp;
temp << p.bee;
string tempbee = temp.str();
size_t len = sizeof(tempbee);
stream.write ((char *)&len, sizeof(tempbee));
stream.write ((char *)&tempbee, len);
您的代码应该看起来像:
size_t len;
string stuff;
stream.read ((char *)&len, sizeof(size_t));
stuff.resize(len,0x00);
stream.read ((char *)&stuff[0], len);
size_t len = tempbee.size();
stream.write ((char *)&len, sizeof(size_t));
stream.write ((char *)&tempbee[0], len);
当在不同的机器体系结构之间传输这些文件时,len
的字节序也会出现问题。
为了解决endianes问题,您可以为文件定义一种兼容格式(例如,始终使用网络字节顺序(又名big-endian))来写入长度,并使用ntohl()
、htonl()
系列的函数来转换为长度值。