如何从C ++文件中读取二进制格式的IP地址?

时间:2016-02-25 11:52:11

标签: c++

如何从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);
    }

1 个答案:

答案 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::copystd::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

您还应该进行一些错误检查,我在示例中省略了这些错误检查以保持简单。