为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2021-11-10 11:07:32
将待发送的字符串转换成单字节,进行发送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菜鸟一只,请高手指点
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

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

查看完整回答
反对 回复 2021-11-14
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

因为string中要额外存储一个结束符'\0'
并且类string在输出时就是以该符号标志本string的结束位置
如果不加1就无法存储结束符,也就不知道string在哪儿结束了,所以会导致越界的错误

查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信