c++ - 如何在 C++ 中读取由空格分隔的十六进制字节数据

标签 c++ file-io hex byte

我在一个文件中有十六进制数据值,我想将它们存储在一个字节数组中。 我尝试使用字符串流,但无法使其正常工作。

我在文件中的数据采用以下格式

05 02 55 AD FF 0F F0 00 77 01 10 CD 00 BB AA 28
02 34 F1 D0 AD 18 84 3C 5A 21 22 43 78 CA BD FE ...

我试过这样的事情

std::ifstream inFile("inFile.txt");
std::string line;
uint8_t data[512];

while (std::getline(inFile, line))
{
    std::istringstream iss(line);
    iss >> data;
}

有什么建议吗?

最佳答案

使用std::hex修饰符。您可以使用 std::vector 来简化数据加载:

#include <vector>
#include <fstream>
#include <iostream>
#include <stdint.h>

int main()
{
    std::ifstream inFile("inFile.txt");

    std::vector<uint8_t> data;
    data.reserve(512);

    unsigned int temp;
    while(!inFile.eof()) {
        inFile >> std::hex >> temp;
        data.push_back(temp);
    }

    // Print one element per row
    std::vector<uint8_t>::iterator i;
    for (i = data.begin(); i != data.end(); ++i) {
        std::cout << static_cast<unsigned> (*i) << std::endl;
    }

    // C++11 version (more compact)
    // for (auto i = data.begin(); i != data.end(); ++i) {
    //     std::cout << static_cast<unsigned> (*i) << std::endl;
    // }

    return 0;
}

请注意,十六进制数被读取为 unsigned int:这是因为 int8_t 被视为 char,因此从 中提取>ifstream 会一次出现一个字符,而不是一次出现一个数字。这仅适用于 temp,因为您的结果是一个 uint8_t 数组,如您所愿。 打印时也会发生同样的情况:我将其转换回 unsigned,以便它显示为数字,而不是字符代码。

请注意,这是一个示例。您应该在代码中做更多的错误检查。

关于c++ - 如何在 C++ 中读取由空格分隔的十六进制字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16583460/

相关文章:

c++ - vxworks,在运行时确定 Debug模式

python - 读取日志数据的二进制文件并使用 int 输出到新文件(python)

python - 使用 Python 转义序列格式化字符串

c# - 将十六进制字符串解析为以 10 为基数的长整数

c++ - Qt 在另一个线程中为工作对象排队退出事件

c++ - 构建 PHP 扩展时如何检查未损坏的 C++ 符号?

c++ - 如何使用 gcov 抑制模板内联

c++ - 将文本文件读入 C++ 值,由不同的字符分隔

java -\n 从文件读取到列表然后输出时不起作用。 java

java - Linux 中的文件夹或文件 'root' 权限问题