你如何从内存缓冲区c ++中读取

时间:2015-10-06 22:22:29

标签: c++ memory buffer

我是C ++的新手,我试图了解内存操作的工作原理。我习惯了Java和Python,并没有真正接触过这个。

我正在开发一个具有以下结构的项目,这对我来说没有多大意义。

typedef struct
{
  size_t size;
  char *data;
} data_buffer;

这个结构基本上充当缓冲区,指向缓冲区中存储的数据的指针和缓冲区的大小,以允许程序知道缓冲区在读取缓冲区时的大小。

程序如何使用缓冲区的示例:

data_buffer buffer = {0};
//Manipulate data here so it contains pertinent information
CFile oFile;
oFile.Write(buffer.data, buffer.size);

该程序主要使用第三方代码来读取缓冲区中的数据,因此我无法找到如何完成此操作的示例。我的主要问题是我如何读取缓冲区的内容,只给出一个指向字符和大小的指针?但是,我还想了解这实际上是如何工作的。根据我的理解,内存被写入,指向它开始的位置和内存的大小,所以我应该能够遍历内存位置,从内存中抓取每个字符并将其标记到我选择的任何结构上使用,如CString或字符串。然而,我不明白如何迭代记忆。有人能帮助我更好地理解这一点吗?感谢。

3 个答案:

答案 0 :(得分:2)

没有理由不能使用std :: string或CString来操作该数据。 (当你可以使用更高级别的结构时。)

将数据转换为std :: string ,请使用构造函数或赋值运算符:

std::string s( buffer.data, buffer.size );

您甚至可以将它粘贴在std :: stringstream中,这样您就可以将数据缓冲区视为文件:

std::istringstream ss( s );

int n;
ss >> n;

MFC字符串类的工作方式类似。

从字符串中获取数据,您需要将其复制。理想情况下,您将能够分配数据的内存。假设您已将数据写入字符串流

std::ostringstream ss;
ss << name << "," << employee_number;

然后,您可以使用创建data_buffer对象的函数分配所需的空间:

function_that_creates_a_data_buffer( buffer, ss.str().size() );

如果没有这样的功能(应该有!),你必须自己malloc()或者自己新建一个:

buffer.size = ss.str().size();
buffer.data = (char*)malloc( buffer.size );

现在只需复制它:

ss.str().copy( buffer.data, buffer.size );

如果你的缓冲区需要一个空终止符(我到目前为止假设它没有),请确保将一个加到你分配的大小并将最后一个字符设置为零。

buffer.size = ss.str().size + 1;
buffer.data = new char[ buffer.size ];
ss.str().copy( buffer.data, buffer.size );
buffer.data[ buffer.size-1 ] = 0;

请务必查看您将使用的各种课程的文档。

希望这有帮助。

答案 1 :(得分:0)

char *类型的变量实际上是指向内存的指针。您的struct包含char *类型的数据,因此它是指向内存的指针。 (我建议写char *数据而不是char *数据,以帮助保持清晰。)

因此,您可以将其作为查看数据的起点。您可以使用另一个指针遍历缓冲区。

char* bufferInspectorPointer;
bufferInspectorPointer = buffer.data;

bufferInspectorPointer现在将指向缓冲区数据的第一个字节,

*bufferInsepectorPointer

将返回字节的内容。

bufferInspectorPointer++

将指针前进到缓冲区中的下一个字节。

你可以用C ++中的指针进行算术运算,所以

bufferInspectorPointer - buffer.data 

将告诉您已覆盖的字节数。您可以将它与buffer.size进行比较,看看您还有多远。

答案 2 :(得分:0)

由于您将其标记为C ++,我建议您使用算法。您可以使用iterators作为开始,buffer.data作为结束来获取buffer.data + buffer.size。因此,要将内存复制到std::string,您可以执行以下操作:

std::string str(buffer.data, buffer.data + buffer.size);

或者可能附加到字符串上:

str.reserve(str.size() + buffer.size);
std::copy(buffer.data, buffer.data + buffer.size, std::back_inserter(str));

当然,只要不超过buffer.data + buffer.size,您就可以选择不同的一端。