将十六进制转换为从文件 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 文件系统)中的簇号转换为从软盘读取

C++ 二进制文件 & 顺序读写

将ASCII TEXT转换为二进制

在LINUX 系统下如何将二进制转换成ASCII码?

在 C 中将 ascii char[] 转换为十六进制 char[]

C++中怎样进行二进制文件的读写?