从C++文件读取十六进制转换为ASCII的正确方法

0ve6wy6x  于 2023-01-03  发布在  其他
关注(0)|答案(3)|浏览(167)

在我下面的CODE 1代码中,从文件中阅读十六进制并存储在字符串数组中,在打印出来时不会将其转换为ASCII

#include <iostream>
#include <sstream>
#include <fstream>

int main(int argc, char** argv)
{
    // CODE 1
    std::ifstream input("C:\\test.txt"); // The test.txt contains \x48\x83\xEC\x28\x48\x83
    std::stringstream sstr;
    input >> sstr.rdbuf();

    std::string test = sstr.str();
    std::cout << "\nString from file: " << test;
    
    //char* lol = new char[test.size()];
    //memcpy(lol, test.data(), test.size());
    
    ////////////////////////////////////////////////////////
    
    // CODE 2
    std::string test_2 = "\x48\x83\xEC\x28\x48\x83";
    std::cout << "\n\nHardcoded string: " << test_2 << "\n";
    // Prints as ASCII "H(H" , which I want my CODE 1 to do.

}

在我的CODE 2示例中,使用了相同的HEX,并将其打印为ASCII。为什么CODE 1不相同?

3zwtqj6y

3zwtqj6y1#

好的,看起来有些混乱。首先,我必须问你是否确定你知道你的档案里有什么。
就是有没有包含哦,看起来大概二十个字左右:

\
x
4
8

等等
或者它包含一个十六进制48(一个字节),一个十六进制83(一个字节),总共5个字符?
我敢打赌这是第一个,我敢打赌你的文件大约有20个字符长,并且包含了要打印的字符串。
如果是的话,那么代码正在做你所期望的事情,它阅读一行文本,然后把它写回来,如果你想让它像编译器一样解释它,那么你必须自己完成这些步骤。
现在,如果它实际上包含十六进制字符(但我打赌它不包含),那么这是一个有点不同的问题,我们将不得不考虑这个问题,但我认为你只是有一个字符串,其中包括\x,阅读/写不会自动为你做一些魔术。

gijlo24d

gijlo24d2#

当你从文件中读取时,反斜杠字符不会被转义。你从文件中读取的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;
       }
   }
}
67up9zun

67up9zun3#

可以将返回的字符串拆分为\x,然后从string强制转换为int,最后强制转换为char。
此资源将很有帮助
strtokconvert

相关问题