以下代码,buf=new char[strSend.GetLength()*2+1]怎么理解?

将待发送的字符串转换成单字节,进行发送
buf=new char[strSend.GetLength()*2+1]怎么理解? 为什么长度乘二加一呢?
麻烦各位高手指点
//发送数据
void CSerialSampleDlg::OnBnClickedBtnSend()
{
char * buf =NULL; //定义发送缓冲区
DWORD dwBufLen = 0; //定义发送缓冲区长度
CString strSend = L"";

//得到发送输入框
CEdit *pEdtSendMsg = (CEdit*)GetDlgItem(IDC_EDT_SEND);
ASSERT(pEdtSendMsg != NULL);

//串口如果没有打开,直接返回
if (m_pSerial == NULL)
{
AfxMessageBox(L"串口未打开");
return;
}

//得到待发送的字符串
pEdtSendMsg->GetWindowTextW(strSend);

//将待发送的字符串转换成单字节,进行发送
buf = new char[strSend.GetLength()*2+1];
ZeroMemory(buf,strSend.GetLength()*2+1);
//转换成单字节进行发送 
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,strSend.GetBuffer(strSend.GetLength())
,strSend.GetLength(),buf,strSend.GetLength()*2,NULL,NULL);

dwBufLen = strlen(buf) + 1;
//发送字符串
m_pSerial->WriteSyncPort((BYTE*)buf,dwBufLen);

//释放内存
delete[] buf;
buf = NULL;
}

没看懂为什么要将它转换成单字节来发送,并且长度要乘以2
菜鸟一只,请高手指点

慕尼黑5688855
浏览 346回答 2
2回答

守着一只汪

字符串以'\0'结束,加1应该是为了存放这个'\0'.你的strSend是什么类型的?你使用的字符是Unicode,属于宽字节字符,每个宽字节占两个byte,转换成单字节时,所以要*2.

喵喵时光机

因为string中要额外存储一个结束符'\0'并且类string在输出时就是以该符号标志本string的结束位置如果不加1就无法存储结束符,也就不知道string在哪儿结束了,所以会导致越界的错误
打开App,查看更多内容
随时随地看视频慕课网APP