如何从C ++文件中读取二进制格式的IP地址?
Clarfication:该文件包含4个字节的实际二进制数据。以下文本格式的零和零仅用于说明目的!
如果我有一个包含位的二进制文件,表示为零,一个看起来像: 00000001 00000000 00010011 00000111 00000010 00000000 00010011 00000111 表示IP地址1.0.19.7和2.0.19.7
如何读取二进制文件中的32位值并将其转换为无符号整数?
以下代码有什么问题?
FILE *myfile = fopen("binaryipfile.bin", "r");
unsigned int ip;
char string[32];
while (fgets(string, 32, &myfile)) {
sscanf(string, "%x", &ip);
}
答案 0 :(得分:3)
要从二进制文件读取32位,只需使用fread
读取32位变量。像
uint32_t address;
fread(&address, sizeof(address), 1, myfile);
如果值存储在与网络字节序不同的主机字节序中,则可能必须使用htonl
转换该值。
当然,您必须先以二进制模式打开文件:
FILE *myfile = fopen("binaryipfile.bin", "rb"); // Note the use of "rb"
要使用C++ standard stream library在C ++中进行操作,它将类似于
std::ifstream file("binaryipfile.bin", std::ios::in | std::ios::binary);
uint32_t address;
file.read(reinterpret_cast<char*>(&address), sizeof(address));
无论您使用的是C还是C ++方式,如果您有多个地址,那么请循环读取,可能会将地址放入std::vector
。如果使用与std::copy
和std::istreambuf_iterator
配对的C ++函数std::back_inserter
函数,则可以更简单地完成此操作:
std::vector<uint32_t> addresses;
std::copy(std::istreambuf_iterator<uint32_t>(file),
std::istreambuf_iterator<uint32_t>(),
std::back_inserter(addresses));
在此之后,向量addresses
将包含从文件读取的所有4字节值。如果并非所有文件都包含地址,则可以改为使用std::copy_n
。
您还应该进行一些错误检查,我在示例中省略了这些错误检查以保持简单。