gpt4 book ai didi

c# - 我怎样才能在 C# stream.Read 到非托管内存流?

转载 作者:太空狗 更新时间:2023-10-30 00:36:36 29 4
gpt4 key购买 nike

我可以使用 UnmanagedMemoryStream 在 C# 中读取非托管内存,但我该如何做相反的事情?

我想从托管流直接读入非托管内存,而不是先读入 byte[] 然后复制。我正在对大量请求进行异步流读取,因此增加的内存非常重要(更不用说额外的副本了)。

最佳答案

如果您有一个已知的目标缓冲区并且知道您的数据有多大,这实际上并不太难。再一次,关键的实现是 UnmanagedMemoryStream只是一系列原生字节的薄包装。

您要做的是以通常的方式获取指向您的 native 目标缓冲区的指针。然后你可以在它之上构造一个可写 UnmanagedMemoryStream。将您的源流复制到目标流,瞧!单个副本已将您从托管内存世界转移到 native 内存世界。在 C++/CLI 中,它看起来像这样:

void CopyStreamToNativePtr(Stream^ src, unsigned char* dst)
{
// Assuming we want to start the copy at the beginning of src
src->Seek(0, SeekOrigin::Begin);

// Create an UnmanagedMemoryStream on top of the destination
// with an appropriate size and capacity (We assume the buffer is
// is sized to the source data in this function!)
UnmanagedMemoryStream target(dst, src->Length, src->Length, FileAccess::Write);

// Copy to your heart's content!
src->CopyTo(%target);

// We made the UnmanagedMemoryStream local so that we wouldn't have
// to explicitly Dispose() of it.
}

关于c# - 我怎样才能在 C# stream.Read 到非托管内存流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1367350/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com