我在一个文件中有十六进制数据值,我想将它们存储在一个字节数组中。 我尝试使用字符串流,但无法使其正常工作。
我在文件中的数据采用以下格式
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/