将十六进制转换为从文件 C++ 读取的 ASCII 的正确方法
Posted
技术标签:
【中文标题】将十六进制转换为从文件 C++ 读取的 ASCII 的正确方法【英文标题】:Proper way to convert HEX to ASCII read from a file C++ 【发布时间】:2021-12-31 20:47:27 【问题描述】:在我下面的代码CODE 1
中,从文件中读取 HEX 并存储在字符串数组中不会在打印输出时将其转换为 ASCII
。
请删除
【问题讨论】:
您的字符串test_2
永远不会包含\x48\x83\xEC\x28\x48\x83
,C++ 编译器已经处理了转义序列并将生成的二进制数据放入std::string
变量中。对于来自文件的输入,您必须处理转义序列。
但是,当您可以使用 HEX 编辑器时,一个问题是为什么您首先将 C++ 字符转义序列写入文本文件。然后,您将在编辑时使用十六进制值,生成的文件将包含您的程序想要的真实二进制数据。
\xNN
转义序列仅适用于代码中的字符串文字,不适用于内存中的字符或从文件中读取的字符。
在 C++ 代码中,以下字符串文字等价于 "ABC"
、"\x41\x42\x43"
、"\0101\0102\0103"
,甚至是 "A\x42\0103"
。 ASCII 文本文件只是文本,没有“转义序列”语法。
【参考方案1】:
好的,看起来有些混乱。首先,我必须询问您是否确定您知道文件中的内容。
也就是说,它是否包含,哦,它看起来像大约20个字符:
\
x
4
8
等等?
或者它是否包含一个十六进制 48(一个字节)、一个十六进制 83(一个字节),总共 5 个字符?
我敢打赌这是第一个。我敢打赌,您的文件大约有 20 个字符长,并且确实包含要打印的字符串。
如果是这样,那么代码正在执行您期望的操作。它正在读取一行文本并将其写回。如果您希望它像编译器那样实际解释它,那么您将不得不自己执行这些步骤。
现在,如果它实际上包含十六进制字符(但我打赌它不包含),那么这是一个有点不同的问题,我们将不得不看看它。但我认为你只有一个字符串,其中包含\x
。读/写不会自动为你带来魔法。
【讨论】:
您好,感谢您的回答。是的,该文件包含作为字符串的 HEX 值,就像它打印出来一样。这意味着我做错了。我一直在试图弄清楚如何阅读或正确转换它,以便将其打印为 ASCII 好吧,当你说它包含 HEX 值时,我不确定你是否明白你在说什么。文件多长时间?大约 20 个字节?然后不,它不包含十六进制值。它包含 ASCII 字符。如果它大约是 5 或 6 个字节,那么 C++ 不会按照您指示的方式打印它。【参考方案2】:当您从文件中读取时,反斜杠字符不会被转义。您来自文件的test
字符串实际上是一个字符数组:'\\', 'x', '4', '8', ...
而您的硬编码文字字符串 "\x48\x83\xEC\x28\x48\x83";
完全被编译器转义为十六进制。
如果您真的想将数据作为一系列“反斜杠 x NN”序列存储为文本文件,则需要在读取文件后进行转换。这是一个可以为您完成的破解循环。
std::string test = sstr.str();
char temp[3] = ;
size_t t = 0;
std::string corrected;
for (char c : test)
if (isxdigit(c))
temp[t] = c;
t++;
if (t == 2)
t = 0;
unsigned char uc = (unsigned char)strtoul(tmp, nullptr, 16);
corrected += (char)uc;
【讨论】:
嘿,谢谢。我测试了你的代码,并从那个文件中打印出HHHHHHHHHHHHH(H(H(H(H(HH(HH(HH(HH(H
,这似乎比它应该长得多
如果您觉得答案有用,别忘了点赞和/或接受它。【参考方案3】:
您可以在\x
中拆分返回的字符串,然后从字符串转换为整数,
最后转换为 char。
这个资源会很有帮助
strtok 和convert
【讨论】:
我可以将文件读取为4883EC284883
而不是剥离\x
然后转换它?也许更容易?
不,您需要将每个字符串从 string 转换为 int,然后转换为 charecter 例如:"48"
到 48 然后用 char 将其转换为 zero char
以上是关于将十六进制转换为从文件 C++ 读取的 ASCII 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
将存储在 FAT 表(FAT12 文件系统)中的簇号转换为从软盘读取