Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C++;? 如何从C++中的文件中读取二进制地址?_C++ - Fatal编程技术网

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

如何从C++;? 如何从C++中的文件中读取二进制地址?,c++,C++,claration:该文件包含4个字节的实际二进制数据。以下文本格式的1和0仅用于说明目的 如果我有一个二进制文件,其中包含位,表示为0和1,如下所示: 00000001 00000000 00010011 00000111 00000010 00000000 00010011 00000111 表示ip地址1.0.19.7和2.0.19.7 如何从二进制文件中读取32位值并将其转换为无符号整数 下面的代码有什么问题 FILE *myfile = fopen("binaryipfile.b

claration:该文件包含4个字节的实际二进制数据。以下文本格式的1和0仅用于说明目的

如果我有一个二进制文件,其中包含位,表示为0和1,如下所示: 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);
    }

要从二进制文件中读取32位,只需使用读入32位变量。像

uint32_t address;
fread(&address, sizeof(address), 1, myfile);
如果该值存储在与网络端不同的主机端,则可能必须使用
htonl
转换该值

当然,您必须首先以二进制模式打开文件:

FILE *myfile = fopen("binaryipfile.bin", "rb");  // Note the use of "rb"

在C++中使用,它会像

std::ifstream file("binaryipfile.bin", std::ios::in | std::ios::binary);

uint32_t address;
file.read(reinterpret_cast<char*>(&address), sizeof(address));
在此之后,向量
地址将包含从文件读取的所有4字节值。如果不是所有文件都包含地址,则可以使用


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

您了解二进制和base-2 ASCII之间的区别吗。您是如何得出结论认为“%x”表示二进制文件的?因此该文件实际上不是二进制文件,它包含作为文本的数字
0
1
?无论“字节”之间是否有空格?对于解析输入,请从头到尾循环字符串,记住最左边的字符是位31,最右边的字符是位0。然后使用移位和或等位运算。当然,如果文件实际上是一个文本文件,而不是一个实际的二进制文件,在这种情况下,您将其读入一个32位无符号整数,您的地址就全部完成了(endianness问题除外)。哦,最后一点不是关于您对
fgets
的使用,最后一个参数是
文件*
,您正在向它传递一个
文件**
。然后您的第一个问题是将其用作文本文件。你应该用二进制模式打开,并且不能使用诸如<代码> fgs>代码>的文本函数来读取数据。因为问题被标记为C++,你也可以添加C++的习惯用法吗?这个答案被引用了。结果表明,
istreambuf\u迭代器的最后一位是错误的。
std::vector<uint32_t> addresses;
std::copy(std::istreambuf_iterator<uint32_t>(file),
          std::istreambuf_iterator<uint32_t>(),
          std::back_inserter(addresses));