gpt4 book ai didi

c++ - 从 (char*, size_t) 创建 C++ 内存流的更简单方法,无需复制数据?

转载 作者:IT老高 更新时间:2023-10-28 12:45:32 27 4
gpt4 key购买 nike

我找不到任何现成的,所以我想出了:

class membuf : public basic_streambuf<char>
{
public:
membuf(char* p, size_t n) {
setg(p, p, p + n);
setp(p, p + n);
}
}

用法:

char *mybuffer;
size_t length;
// ... allocate "mybuffer", put data into it, set "length"

membuf mb(mybuffer, length);
istream reader(&mb);
// use "reader"

我知道 stringstream,但它似乎无法处理给定长度的二进制数据。

我是在发明自己的轮子吗?

编辑

  • 不得复制输入数据,只需创建可迭代数据的内容即可。
  • 它必须是可移植的——至少它应该在 gcc 和 MSVC 下都能工作。

最佳答案

我假设您的输入数据是二进制的(不是文本),并且您想从中提取大量的二进制数据。无需复制您的输入数据。

您可以组合boost::iostreams::basic_array_sourceboost::iostreams::stream_buffer (来自 Boost.Iostreams )与 boost::archive::binary_iarchive (来自 Boost.Serialization )能够使用方便的提取 >> 运算符来读取二进制数据 block 。

#include <stdint.h>
#include <iostream>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/archive/binary_iarchive.hpp>

int main()
{
uint16_t data[] = {1234, 5678};
char* dataPtr = (char*)&data;

typedef boost::iostreams::basic_array_source<char> Device;
boost::iostreams::stream_buffer<Device> buffer(dataPtr, sizeof(data));
boost::archive::binary_iarchive archive(buffer, boost::archive::no_header);

uint16_t word1, word2;
archive >> word1 >> word2;
std::cout << word1 << "," << word2 << std::endl;
return 0;
}

在 AMD64 上使用 GCC 4.4.1,它会输出:

1234,5678

Boost.Serialization 非常强大,它知道如何序列化所有基本类型、字符串,甚至 STL 容器。您可以轻松地使您的类型可序列化。请参阅文档。隐藏在 Boost.Serialization 源代码中的某个地方是一个可移植二进制存档的示例,它知道如何为您的机器的字节序执行正确的交换。这也可能对您有用。

如果您不需要 Boost.Serialization 的花哨并且乐于以 fread() 类型的方式读取二进制数据,您可以使用 basic_array_source以更简单的方式:

#include <stdint.h>
#include <iostream>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

int main()
{
uint16_t data[] = {1234, 5678};
char* dataPtr = (char*)&data;

typedef boost::iostreams::basic_array_source<char> Device;
boost::iostreams::stream<Device> stream(dataPtr, sizeof(data));

uint16_t word1, word2;
stream.read((char*)&word1, sizeof(word1));
stream.read((char*)&word2, sizeof(word2));
std::cout << word1 << "," << word2 << std::endl;

return 0;
}

我用这个程序得到相同的输出。

关于c++ - 从 (char*, size_t) 创建 C++ 内存流的更简单方法,无需复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2079912/

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