【问题标题】:Reading hexadecimals from a txt file in C++从 C++ 中的 txt 文件中读取十六进制
【发布时间】:2012-09-15 17:51:10
【问题描述】:

我有一个 txt 文件,其中每行包含十六进制形式的整数,例如: 232B2344 A2BC34893 DEF9433 ...... 我想要一种优雅的方式来用 C++ 读取这个 .txt 文件并将它们存储在数组中,以便我可以对它们进行计算。还给定十六进制 232B2344 说我想说明每个字节条目的值

【问题讨论】:

  • 我试图逐行获取它们,但将它们作为字符串读取......我希望我的程序将它们实现为十六进制......所以我想在每一行中逐个字符地读取并将每一行存储在一个十六进制中
  • 发布您的尝试以及哪里出错/想要改进。
  • fstream myfile; myfile.open("entropy.txt");无符号整数测试器;字符串测试;我的文件 >> 测试仪; cout
  • std::hex:当基域设置为十六进制时,插入流中的整数数值以十六进制基数(基数 16)表示。 - hex 仅适用于数值,NOT 适用于字符串。

标签: c++ hex


【解决方案1】:

首先包含一个标题

#include "sstream"

然后使用文件处理在一个简单的 char[] 数组字符串中获取十六进制值。

char str[100];

声明一个无符号整数变量...

unsigned int value;

然后声明一个“std::stringstream”变量。例如

std::stringstream ss;
ss<<std::hex<<str;
ss>>value;

现在“值”以整数形式包含文件中的十六进制值。

【讨论】:

    【解决方案2】:

    据您描述,文件中的每个数字都是一个 4 字节的无符号整数(适合 32 位)。这里有一个用于解析文件并获取数字数组的 c++ 版本:

    std::vector<std::string> fromFileToArray( const std::string & fileName )
    {
      std::string line;
      std::vector<uint32_t> numbers;
      std::stringstream ss;
      uint32_t tmp;
    
      std::ifstream numbersFile( fileName.c_str() );
      while( numbersFile.good() )
      {
        getline( numbersFile, line );
        ss << std::hex << line;
        ss >> tmp;
        numbers.push_back( tmp );
      }
    }
    

    【讨论】:

      【解决方案3】:

      这个怎么样(虽然它是用 C 函数编写的,但可以帮我移植它以使用 C++ 函数):

      const char hexstring[] = "deadbeef10203040b00b1e50", *pos = hexstring;
      unsigned char val[12];
      size_t count = 0;
      
      /* WARNING: no sanitization or error-checking whatsoever - MAGIC. DO NOT TOUCH. */
      for(count = 0; count < sizeof(val)/sizeof(val[0]); count++) {
          sscanf(pos, "%2hhx", &val[count]);
          pos += 2 * sizeof(char);
      }
      
      /* Does it work? */
      printf("0x");
      for(count = 0; count < sizeof(val)/sizeof(val[0]); count++)
          printf("%02x", val[count]);
      printf("\n");
      

      如果字符串中有奇数个十六进制数字,您必须确保在其前面加上一个起始 0。例如,字符串"f00f5" 将被上面的示例错误地评估为{0xf0, 0x0f, 0x05},而不是正确的{0x0f, 0x00, 0xf5}

      【讨论】:

      • 感谢您的评论...我希望输入来自一个 txt 文件,其中十六进制(如 3929AB3094 开头没有出现 0x)逐行写入。每一行对应一个十六进制..我想将这些值转换为十六进制到我的程序中...也许如果我假设 txt 条目是字符串然后将它们转换为十六进制?
      • 使用std::ifstream::getline,您可以在char* 中逐行存储并在其上运行sscanf 循环以获取字节数组中的值。不需要前面的0x,就像您在上面的代码中看到的那样。我只是在它前面输出值。
      【解决方案4】:

      要以十六进制格式读取值 - 使用来自 &lt;iomanip&gt;std::hex。就像在这个非常简短的例子中一样:

      #include <iostream>
      #include <iomanip>
      
      int main() {
        int value;
        std::cin >> std::hex >> value;
        std::cout << value;
      }
      

      只要你的数组有元素就读多少次。

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 2015-05-01
        • 2015-12-09
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2014-02-25
        • 1970-01-01
        相关资源
        最近更新 更多