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

时间:2013-05-16 09:16:47

标签: 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;
}

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用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,以便显示为数字,而不是字符代码。

请注意,这是一个例子。您应该在代码中进行更多错误检查。