我正在使用十六进制数据编辑文件。 例如,在我的代码中我有这个:
const char data1[4] = {0xAA, 0xBB, 0xCC, 0xDD};
file.write(data1, 4);
这很有效。我用十六进制编辑器打开文件,可以看到AABBCCDD。
但当我通过用户输入获取十六进制数据时,我不知道如何格式化它。它以字符串形式出现,可能是AABBCCDD
。但是,如果我将其写入我的文件,我将获得代表我的数据中的A,A,B,B的ASCII十六进制值。
我想将带有十六进制值的字符串转换为char数组,如上面的data1
。
我搜索并发现了一些我认为可以帮助我的代码。 我改变了它并提出了这个但它似乎不起作用,并想知道是否有更好的方法。
char* hxStringToHxArray (std::string hxinput)
{
std::stringstream ss;
char* outputchar = new char[(hxinput.length())/2];
unsigned int buffer;
int offset = 0;
int pos = 0;
while (offset < hxinput.length()) {
ss.clear();
ss << std::hex << hxinput.substr(offset, 2);
ss >> buffer;
outputchar[0] = (static_cast<unsigned char>(buffer));
offset += 2;
pos++;
}
return outputchar;
}
可能代码存在一些问题,但如果有更好的方法可以做到这一点,我很高兴听到。 我不会处理动态长度的十六进制字符串,我将始终知道长度,这有助于。 感谢。
EDIT。 啊,我刚刚意识到我的示例数据中存在错误。我更新了,抱歉。
答案 0 :(得分:1)
您可以编写自己的解析器,也可以使用std::strtol
。任何一个都应该工作。这是一个家庭酿造实现,假设字符A
- F
和a
- f
是连续编码的:
#include <cstdlib>
#include <string>
#include <vector>
unsigned char parse_hex(char c)
{
if ('0' <= c && c <= '9') return c - '0';
if ('A' <= c && c <= 'F') return c - 'A' + 10;
if ('a' <= c && c <= 'f') return c - 'a' + 10;
std::abort();
}
std::vector<unsigned char> parse_string(const std::string & s)
{
if (s.size() % 2 != 0) std::abort();
std::vector<unsigned char> result(s.size() / 2);
for (std::size_t i = 0; i != s.size() / 2; ++i)
result[i] = 16 * parse_hex(s[2 * i]) + parse_hex(s[2 * i + 1]);
return result;
}
答案 1 :(得分:1)
我认为你这样做很复杂:
int main()
{
int input[10];
for (int i =0; i < 10; i++) {
std::cin >> std::hex >> input[i];
}
}
这当然没有错误处理,但应该做你想做的事情:
0xAB
char
的数字(我认为通常等于unsigned short
)编辑:当使用char-array时,C ++尝试使用smart-ass并改为给出ASCII值。您可以获取int值并尝试根据您想要做的事情来构建它们。
完整的代码是:
#include <iostream>
#include <fstream>
int main()
{
int input[10];
char c[10];
for (int i = 0; i < 10; i++) {
std::cin >> std::hex >> input[i];
std::cout << "Hex input: " << std::hex << input[i] << "\n"
<< "Hex input as Dec: " << std::dec << input[i] << "\n";
c[i] = static_cast<char>(input[i]);
}
std::ofstream myfile;
myfile.open("/tmp/file.txt");
myfile.write(c, 10);
myfile.close();
}
输入:
1
2
3
4
5
A
B
C
D
E
在文件中:
$ hexdump -e '/1 "%#X "' /tmp/file.txt
0X1 0X2 0X3 0X4 0X5 0XA 0XB 0XC 0XD 0XE %