C ++打印DWORD_PTR *字符串到文件

时间:2016-01-09 01:05:33

标签: c++ string io inline-assembly

我创建了一个函数,它接受一个DWORD_PTR *(保存我们使用内联汇编获得的字符串的地址)和一个int(字符串/ char *的大小)

该函数应该简单地获取DWORD_PTR *中的数据,然后将其作为字符串打印到文件中...

然而......它以4组为单位打印了一堆数字......这是输出的例子(前几行)......

4e65 7720 5061 636b 6574 2052 6563 6569
7665 6420 6f66 2053 697a 653a 2031 380d
0a03 1404 0000 0000 0000 0000 0000 0000
0007 140d 0a0d 0a4e 6577 2050 6163 6b65
7420 5265 6365 6976 6564 206f 6620 5369
7a65 3a20 340d 0a01 0001 000d 0a0d 0a4e
6577 2050 6163 6b65 7420 5265 6365 6976
6564 206f 6620 5369 7a65 3a20 3138 0d0a

这是函数......

void PrintDataString(const DWORD_PTR* data_address, const int data_size)
{
    const char* data = ((char*)(data_address));

    // Open our Log File...
    std::ofstream log_file;
    log_file.open("TheLog.log", std::ios::app);

    for (int i = 0; i < data_size; i++)
    {
        log_file << data[i];
    }

    // Add some spacing for next entry...
    log_file << std::endl << std::endl;

    log_file.close();
}

2 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,您的文本查看器(Sublime)只是以二进制十六进制格式而不是文本显示文件内容。

话虽这么说,为什么你使用DWORD_PTR*指针传递字符数据? DWORD_PTR只是一个无符号整数,足以在所有平台上保存指针值。不要把它与真正的指针混淆。您应该将函数传递给实际的字符数据:

void PrintDataString(const char* data, const int data_size)
{
    // Open our Log File...
    std::ofstream log_file;
    log_file.open("TheLog.log", std::ios::app);

    /*
    for (int i = 0; i < data_size; i++)
    {
        log_file << data[i];
    }
    */
    log_file.write(data, data_size);

    // Add some spacing for next entry...
    log_file << std::endl << std::endl;

    log_file.close();
}

IF (我强调IF,因为这将是非常笨拙的编码)你实际上是在DWORD_PTR变量中存储一个字符指针值,然后通过地址将该变量传递给功能,例如:

char *data = ...;
DWORD_PTR address = (DWORD_PTR) data;
void PrintDataString(&address, ...);

然后,您需要执行额外的解除引用操作以获取字符数据:

void PrintDataString(const DWORD_PTR* data_address, const int data_size)
{
    const char* data = (const char*) *data_address; // <-- note the extra *
    ...
}

另一方面,如果将字符数据指针传递给函数,则只需对其进行类型转换:

char *data = ...;
DWORD_PTR *address = (DWORD_PTR*) data;
void PrintDataString(address, ...);

然后你不需要额外的解除引用:

void PrintDataString(const DWORD_PTR* data_address, const int data_size)
{
    const char* data = (const char*) data_address;
    ...
}

无论哪种方式,以这种方式使用DWORD_PTR是传递字符数据指针的一种非常尴尬的方式。

答案 1 :(得分:0)

有一些不可打印的字符 - 例如00和01 - 所以也许Sublime Text认为它是一个二进制文件而不是文本文件,并以二进制形式显示给你。

即,TheLog.log 是一个文本文件;也许你得到的指针所指向的是一个包含字符串但也包含二进制值的数据结构,或者包含用空值填充到固定大小的字符串的缓冲区,或类似的东西。