如何将内存块的指针强制转换为std流

时间:2010-05-18 09:18:04

标签: c++ casting load stream resources

我已经在Windows XP和Visual Studio中使用c ++语言编写了一个应用程序。

在该应用程序中,我使用LoadResource()API加载资源,以便在资源内存中提供文件。

它返回了一个内存块指针,我想将指针转换为std流以用于兼容性。

有人能帮帮我吗?

3 个答案:

答案 0 :(得分:2)

您无法资源投射到流类型。要么复制字节:

std::stringstream ss;
ss.rdbuf().sputn(buf, len);

或者您将资源包装在自己的streambuf中:

class resourcebuf : public std::streambuf {
   // Todo: implement members including at least xsgetn, uflow and underflow
};

并将其传递给istream::istream

答案 1 :(得分:1)

你为什么需要这个?

将原始数据指针转换为流意味着对资源进行逐字节复制,因此缺乏性能(另外,我认为这种方法没有任何好处)。

如果您想使用原始内存,请使用它。在这里投射(兼容性?)似乎是一种非常奇怪的方法。

但是,如果你想这样做,你可以从内存块创建一些流,将其视为一个字节序列。在这种情况下,这意味着使用std::stringstreamistringstream)。

LockResource锁定资源后,从收到的void*指针创建一个字符串,并将其传递给stringstream实例。

void* memory = LockResource(...);
// You would probably want to use SizeofResource() here
size_t memory_size = ... ;
std::string casted_memory(static_cast<char*>(memory), memory_size);
std::istringstream stream(casted_memory);

答案 2 :(得分:0)

最简单的方法可能是将缓冲区转换为string,然后转换为stringstream

std::stringstream ss(std::string(buf,len));

我认为这会复制两次,所以如果结果需要花费很多时间,你可能需要寻找替代方案。您可以使用strstream,但它可能会使广场变得怪异。