C++ ntohl()的跨平台版本?-C++;
我正在编写一个跨平台客户机,在为使用而提取的档案中,它对每个文件使用IEEE 802.3以太网CRC-32校验和。我对所有文件运行此检查,如下所示:C++ ntohl()的跨平台版本?-C++;,c++,cross-platform,endianness,C++,Cross Platform,Endianness,我正在编写一个跨平台客户机,在为使用而提取的档案中,它对每个文件使用IEEE 802.3以太网CRC-32校验和。我对所有文件运行此检查,如下所示: if(s3d_meta_block.crc != 0x61580AC9) { errorLog.writeError("File %i is not a valid file/ or is the directory", i); } 它最终在每一个文件上都失败了,我发现它是用ntohl(0x61580AC9)在类似的客户机中编写的 我是在
if(s3d_meta_block.crc != 0x61580AC9)
{
errorLog.writeError("File %i is not a valid file/ or is the directory", i);
}
它最终在每一个文件上都失败了,我发现它是用ntohl(0x61580AC9)在类似的客户机中编写的
我是在64位Windows上写这篇文章的,我希望这篇文章能够在所有平台上运行,而不必包含“Winsock2.h”和其他与endianess相反的库
谢谢 ntohl()包含在许多平台上,并且将/不会根据处理器对齐的需要交换位。代码中唯一需要的是#def’s包含此函数的正确头文件(我从未见过没有它的操作系统)ntohl()包含在许多平台上,并且不会根据处理器的需要交换位。代码中唯一需要的是#def包含此函数的正确头文件(我从未见过没有它的操作系统),def可能依赖于是否定义了WIN32。如果不是,则使用include而不是winsock。@dbrank0如果要发表好的评论,请发表示例;-)@AdrianCornish
ntohl
仅在字节顺序不是big-endian时交换。对齐与此无关。@moshbear您能再详细说明一下吗。因此,如果我要运行ntohl,它会检测它是什么样的endianess,然后只在需要时交换它?@Satchmo-ntohl
知道它所在的平台,所以它不必检测任何东西。在某些系统上它更改数据,在另一些系统上它不需要做任何事情。def可能依赖于是否定义WIN32。如果不是,则使用include而不是winsock。@dbrank0如果要发表好的评论,请发表示例;-)@AdrianCornishntohl
仅在字节顺序不是big-endian时交换。对齐与此无关。@moshbear您能再详细说明一下吗。因此,如果我要运行ntohl,它会检测它是什么样的endianess,然后只在需要时交换它?@Satchmo-ntohl
知道它所在的平台,所以它不必检测任何东西。在某些系统上,它更改数据,在另一些系统上,它不需要做任何事情。