C++ C++;在内存地址读取一些字节,输出为字符串

C++ C++;在内存地址读取一些字节,输出为字符串,c++,arrays,string,function,pointers,C++,Arrays,String,Function,Pointers,函数从未知DLL返回指针和长度(通过参数) Result = SpamnEggs( &pBytes, &nBytes ) 指针指向一个有效的内存地址,在该地址上有N字节的连续字节。 这些字节包含文本的有效ascci值。没有空终止 我在“输出”:“/VP>”之前,在“一般”C++代码(没有复杂的库或使用字节)中,很少有一种类型的字符串类型为“强”>简单> /强>操作: cout << sresult 非常感谢大家。答案很好,而且都非常有效。您可以复制原始内存并自己添

函数从未知DLL返回指针和长度(通过参数)

Result = SpamnEggs( &pBytes, &nBytes )
指针指向一个有效的内存地址,在该地址上有N字节的连续字节。 这些字节包含文本的有效ascci值。没有空终止

我在“输出”:“/VP>”之前,在“一般”C++代码(没有复杂的库或使用字节)中,很少有一种类型的字符串类型为“强”>简单> /强>操作:

cout << sresult

非常感谢大家。答案很好,而且都非常有效。

您可以复制原始内存并自己添加字符串终止字符:

char* newStr = new char[size + 1];
memcpy ( newStr, source, size );
newStr[size] = "\0";
cout << newStr;
用法示例:

   char* x = "blablabla";
   int length = 3;
   MyString str(x,length);
   cout << str;
char*x=“blabla”;
整数长度=3;
MyString str(x,长度);

cout您可以复制原始内存并自己添加字符串终止字符:

char* newStr = new char[size + 1];
memcpy ( newStr, source, size );
newStr[size] = "\0";
cout << newStr;
用法示例:

   char* x = "blablabla";
   int length = 3;
   MyString str(x,length);
   cout << str;
char*x=“blabla”;
整数长度=3;
MyString str(x,长度);

你必须做的是

a) 创建一些封装字符指针和大小的类


b) 写一篇你要做的是

a) 创建一些封装字符指针和大小的类


b) 写一个你可以从指针和一个长度构造一个std::string

std::string sResult(pBytes, nBytes);
std::cout << sResult;
std::字符串sResult(pBytes,nBytes);

std::cout您可以从指针和长度构造一个std::字符串

std::string sResult(pBytes, nBytes);
std::cout << sResult;
std::字符串sResult(pBytes,nBytes);

std::cout像这样的(未经测试的代码)如何:

class my\u指针\u字符串
{

friend std::ostream&operator类似这样的(未经测试的代码)如何:

class my\u指针\u字符串
{


friend std::ostream&Operator with Overlapping您的意思是不允许复制字符序列?或者这是一种可能的方法?您应该创建一个全新的类来处理这些字符串?或者您可以只使用
std::string my_string(静态_cast(指针),长度)
?可以使用std:string是的。让我测试一下这个想法…@Joachim Pileborg:这个构造函数复制整个字符串。这不是他想做的。@Mike:
std::string
将复制缓冲区。覆盖意味着你不允许复制字符序列?或者这是一种可能的方法吗?你应该创建一个品牌new类来处理这些字符串?或者您可以只使用
std::string my_string(static_cast(指针),length)
?可以使用std:string是的。让我来测试一下这个想法…@Joachim Pileborg:这个构造函数复制了整个字符串。这不是他想要做的。@Mike:
std::string
将复制缓冲区。很抱歉忘了提到,没有copymem。没有家庭作业,一天的漫长工作就结束了,一个演示应用程序的简单解决方案不会让客户端崩溃!非常好解决方案,技术上很好…只是注释太多了。对不起,忘了提,没有copymem。没有家庭作业,一个演示应用程序的简单解决方案结束了漫长的一天,不会让客户端崩溃!非常好的解决方案,技术上很好…只是注释太多了。它必须简单,而且是在线的。我相信没有办法让所有内容都在线。c类一个类应该是非常轻量级的,移位运算符是一行(只需循环并输出每个字符)。完成后,实际调用将如下所示:cout它必须是简单的,并且是内嵌的。我相信没有办法让所有内容都是内嵌的。类可以是非常轻量级的,移位运算符是一行(只需循环并输出每个字符)完成后,实际调用将如下所示:我可以从Void更改原型吗?这是一种简单而干净的方法。但是它复制了我认为/认为OP@Kit不打算复制的源数据。就像我在问题上所评论的那样:“如果我们写的是
cout
,会注意到额外的副本吗?”。进行I/O比构造字符串复杂得多。@Bo Persson:同意,这只是解释解决方案之间差异的一个注释。根据数据和目标流的大小,它可能会产生差异或不产生差异。我可以从Void*更改原型,这是一种简单而干净的方法。但它复制了源数据我认为/认为OP.@Kit并不是有意这样做的——就像我在问题上所评论的那样:“如果我们写信给
cout
,会有额外的副本吗?”。做I/O比构造字符串复杂得多。@Bo Persson:同意,这只是解释解决方案之间差异的一个注释。根据数据和目标流的大小,它可能会产生差异或不产生差异。很好,但简单一点,只要几行,这样他们就不会从重要的代码中分心了。很好,b但要想得简单,只要几行,这样他们就不会被重要的代码分心