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

Posted

技术标签:

【中文标题】如何在 C++ 中读取由空格分隔的十六进制字节数据【英文标题】:How to read hex byte data seperated by spaces in C++ 【发布时间】:2022-01-01 11:12:45 【问题描述】:

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

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

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;

有什么建议吗?

【问题讨论】:

你看过***.com/questions/12562169/… 这里的值是用空格隔开的,所以过程比较简单…… 是的,我已经看过那个问题了。我的问题是我不知道如何让它占一个字节的两位数 【参考方案1】:

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

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

【讨论】:

这似乎无法解决问题。剩下的问题是它将每个数字单独存储在我的字节数组中。 0, 5, 0, 2, .... 对,我专注于十六进制提取问题。检查编辑。 这仍然是单独存储数字。我想从文件中一次需要一个字符。不太确定流是如何工作的 在你所说的“我想将它们存储在一个字节数组中”的问题中。我建议你的实际上是一个位数组,C++ 风格。实际上,这是一个动态数组,因此您不必提前知道要存储的字节数。也许你的意思是别的?请澄清:) 我真的不明白你所说的位数组是什么意思。我尝试做的是将文件中由空格分隔的每个值存储在字节数组的不同索引中。在我的文件中,两位数字用于表示一个字节的十六进制值。在我在示例中提到的数据中,第一个值是 05。我想将其存储在 data[0] 中。我想要数据[o] == 0x05,数据[1] == 0x02,数据[2] == 0x55。

以上是关于如何在 C++ 中读取由空格分隔的十六进制字节数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在c中读取由空格分隔的无符号字符

如何在单个输入中(单独)读取由空格分隔的字符串? [关闭]

如何在 C++ 中快速解析空格分隔的浮点数?

文本IO 二进制IO

使用流在 C++ 中读取可变长度输入

如何从具有由“|”分隔的字段的行中提取数据C++中的字符?