2

这是场景;

// I have created a buffer
void *buffer = operator new(100)

/* later some data from a different buffer is put into the buffer at this pointer
by a function in an external header so I don't know what it's putting in there */

cout << buffer;

我想打印出在这个指针处放入缓冲区的数据,看看里面有什么。我想把它打印为原始 ASCII,我知道那里会有一些不可打印的字符,但我也知道一些清晰的文字被推到那里。

根据我在 Internet 上阅读的内容,cout无法打印出未转换的数据,例如 a void,而不是intor char。但是,编译器不会让我使用(char)例如动态转换它。我应该创建一个单独的变量,将值转换为指针然后cout该变量,还是有一种方法可以直接保存在另一个变量上?

4

4 回答 4

6

执行以下操作:

// C++11
std::array<char,100> buf;
// use std::vector<char> for a large or dynamic buffer size

// buf.data() will return a raw pointer suitable for functions
//   expecting a void* or char*
// buf.size() returns the size of the buffer

for (char c : buf)
    std::cout << (isprint(c) ? c : '.');

// C++98
std::vector<char> buf(100);

// The expression `buf.empty() ? NULL : &buf[0]`
//   evaluates to a pointer suitable for functions expecting void* or char*

// The following struct needs to have external linkage
struct print_transform {
    char operator() (char c) { return isprint(c) ? c : '.'; }
};

std::transform(buf.begin(), buf.end(),
               std::ostream_iterator<char>(std::cout, ""),
               print_transform());
于 2012-05-10T16:38:55.337 回答
1

如果你想逐个字节地去,你可以使用一个 unsigned char 并迭代它。

unsigned char* currByte = new unsigned char[100];
for(int i = 0; i < 100; ++i)
{
    printf("| %02X |", currByte[i]);
}

这不是一个非常现代(甚至是非常“C++”)的答案,但它会为您将其打印为十六进制值。

于 2012-05-10T16:39:34.780 回答
1

做这个:

char* buffer = new char[100];

std::cout << buffer; 
// at some point
delete[] buffer;

void*您只需要在某些情况下,主要用于与 C 接口的互操作,但这绝对不是需要 a 的情况void*,它基本上会丢失所有类型信息。

于 2012-05-10T16:33:08.787 回答
1

您需要将其转换为char*: reinterpret_cast<char*>(buffer)。问题是它void*代表任何东西,所以只打印指针;当您将其转换为 时char*,内存的内容将被解释为 C 风格的字符串

注意:使用reinterpret_cast<>而不是 C 样式(char *)来使您的意图清晰并避免以后出现微妙且难以发现的错误

注意:当然你可能会得到一个段错误,好像数据确实不是 C 风格的字符串,可能会访问与缓冲区无关的内存

更新:您可以将内存分配给一个char*缓冲区,它也可以解决您的问题:您仍然可以调用您的第 3 方函数(char*隐式可转换为void*,我认为这是第 3 方函数的参数类型)并且您没有根本不需要铸造。您最好的选择是将内存清零并限制 3rd 方函数将超过 99*sizeof(char)字节复制到缓冲区中,以保留结尾的'\0'C 样式字符串终止符

于 2012-05-10T16:34:36.400 回答