0

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

我在文件中的数据格式如下

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;
}

有什么建议么?

4

1 回答 1

3

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

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

于 2013-05-16T09:21:57.000 回答