将字符串从 std::string 转换为 const char * 时出现数据丢失问题

Posted

技术标签:

【中文标题】将字符串从 std::string 转换为 const char * 时出现数据丢失问题【英文标题】:Data loss issue while converting the string from std::string to const char * 【发布时间】:2014-08-21 06:31:56 【问题描述】:

在此函数中,将string 作为参数传递(将大量数据作为字符串)...

SendBytes 方法是这样定义的

bool NetOutputBuffer_c::SendBytes ( const void * pBuf, int iLen )

        BYTE * pMy = (BYTE*)pBuf;

        while ( iLen>0 && !m_bError )
        
                int iLeft = m_iBufferSize - ( m_pBufferPtr-m_pBuffer );
                if ( iLen<=iLeft )
                
                        printf("iLen is %d\n",iLen);
                        memcpy ( m_pBufferPtr, pMy, iLen );
                        m_pBufferPtr += iLen;
                        break;
                

                ResizeIf ( iLen );
        
        return !m_bError;


bool NetOutputBuffer_c::SendCompressedString ( std::string sStr )

    std::cout << sStr << endl;
    const char *cStr = sStr.c_str();
    std::cout << cStr <<endl;

    int iLen = cStr ? strlen(cStr) : 0;
    SendInt ( iLen );
    return SendBytes ( cStr, iLen );

尝试打印 sStr 的值来检查它是否有正确的数据。

然后将std::string 转换为const char *

转换后,尝试打印 cStr 的值。但是它(cStr)实际上包含了实际数据(sStr)的5%......

我需要做什么才能获得全部数据?

有人可以在这方面指导我吗?

【问题讨论】:

您的字符串是否嵌入了空 ('\0') 字符? 字符串有这样的压缩数据 xÚì½ëRãȶ.ú¿"ö;(Ö¹ºã0½ò®Ì½^?^Y0à^B^[^ZCÝNìP^H[`mQ¾ @¹Vìó^ZçõÎ)ù.¶^L6ݽÖìÆ^^,¥ò^[×o|úïÿ¸õ½Nkð^_ÿóÿþ ®;ìû~ë?öþc0ºiº¡^G^?Þ^EÃvß?^^ûÁßñZÞ Ù÷^_~Ð^[èiáXý÷ÿÞû^ Ow8ìÃF^Sý^Ëû^E:nïnäÞéc^Oîp4?Üßr>;^Z¶¾ÿÛ|ðzÃþx8~4£^_½¦ïv^^ûþÓìrÚþ]»^Cÿ^[Nõ^X?ü^³« uáê½þ0Ë;^]ü 压缩数据是二进制格式,你可能应该使用 std::cout.write() 而不是格式化的 你确定吗?如果你这样做,你会得到什么? int x = std::find(sStr.begin(), sStr.end(), '\0') - sStr.begin(); std::cout &lt;&lt; x; @Galik:你能编辑那个代码并告诉我如何获取整个数据吗? 【参考方案1】:

strlen 适用于 c 字符串。也就是说,以空结尾的字符串。它搜索'\0' 字符,并将该字符的位置作为字符串的长度返回。您有压缩的二进制数据,而不是 c 字符串。它几乎可以肯定在字符串结尾之前包含一个 0。请改用sStr.size()

SendInt ( sStr.size() );
return SendBytes ( sStr.c_str(), sStr.size() );

【讨论】:

Benjamin Lindley:好的。我仍然遇到同样的问题...您能否检查并告诉我是否实现了您所说的正确代码。 bool NetOutputBuffer_c::SendCompressedString (std::string sStr) std::cout @user3532122:对SendBytes 的调用是否有效?打印出 c-string 仍然不起作用,原因与 strlen 不起作用的原因相同。你真的需要那个吗?我以为这只是您尝试调试对SendBytes 的失败调用。 但是如果你需要它从 c-string 打印整个字符串(我无法想象为什么),那么使用std::cout.write(sStr.c_str(), sStr.size()); 我可以按照你所说的方法打印数据....但是现在我需要发送可写入的全部数据(sStr.c_str(),sStr.size ()) as Byte * 。我需要做什么才能使其正常工作?

以上是关于将字符串从 std::string 转换为 const char * 时出现数据丢失问题的主要内容,如果未能解决你的问题,请参考以下文章

在 std::string 中仅将数字转换为 int

将内存中的 16 位转换为 std::string

MFC:无法将 std::string 转换为 LPWSTR 放入函数 [重复]

将 std::string 转换为无符号字符数组

如何将 std::string 转换为 WCHAR

将 void* 转换为 std::string