能否帮忙C++改成C# 呢。小妹新手再次求助,望哥哥们解答
感谢前2天小妹发贴后,得到朋友的解答。因为小妹刚学C#,是新手。希望园里有朋友帮助解决一下。
也是上次的问题,测试后结果不一样的。不知什么回事。
C++
CString strSend="abc测试测试";
senddata(strSend.GetBuffer(strSend.GetLength()),strSend.GetLength());
int CVC6ClientDlg::senddata(char * buf,int num)
{
char sendbuf[512];
memcpy(sendbuf,buf,num);
sendbuf[num]='\n';
return SSL_writego(ssl, sendbuf, num+1);
}
改成C#
String strSend="abc测试测试";
byte[] byteSend = Encoding.ASCII.GetBytes(strSend);
senddata(byteSend, strSend.Length);
protected int senddata(byte[] buf, int num)//此方法转成C#不对
{
byte[] sendbuf = new byte[num+1];
buf.CopyTo(sendbuf, 0);
sendbuf[num] = (byte)'\n';
// return SSL_writego(ssl, sendbuf, num+1);
return 0;//只是测试
}
结果中sendbuf 是不一样的 请问C#如何修改?
[解决办法]
这句有误:
senddata(byteSend, strSend.Length);
--〉
senddata(byteSend, byteSend.Length);
若是sendbuf不对,那试一下:
byte[] byteSend = Encoding.ASCII.GetBytes(strSend);
--〉
byte[] byteSend = Encoding.Default.GetBytes(strSend);
你最好给出你想要的sendbuf的内容,就好查找合适的编码格式了。
[解决办法]
在c++中, char* 和 byte* 是一回事,所以String 转 char* 看起来没变
在C#中, String和byte是完全不同的东西,所以在debug中显示是完全不同的格式,
不过其内容还是一样的。
byte[]里显示的实际是该字符串的内存数据, 例如:
字符0的byte会显示为其ASC码 48 或 0x30
[解决办法]
简单的说,在c++字符串中一个汉字占两个长度,你的
CString strSend="abc测试测试";
其长度是3+4*2 = 11。
在C#字符串中,一个汉字只占一个位,其长度是3+4 = 7。
转成byte[]时,根据编码格式不同,其长度是不一样的,
若是UTF16,每个字符占两位,其长度变为 7*2 = 14,
所以要用编码后的长度,不能用原字符串长度。
[解决办法]
若是编码格式与服务器端不一样,服务器就不能正确读出。