C#调用C++ DLL传参byte[]数组字节值大于127时会变为0x3f的问题解决

最近做了一个网络编程的DLL给C#调用,DLL中封装了一个TCP Client的函数接口,如下所示

复制代码
//C++ TCP报文发送接口
int TcpClient_send(unsigned char* buffSend, unsigned int nLen)
{
	unsigned char buff[1024];
	int len = StringToHex(buffSend, buff);
	int nRet = 0;
	if (Connect())
	{
		int sendRes = send(m_hTcpClientSocket, (char*)buff, nLen, 0);
		if (sendRes == SOCKET_ERROR)
		{
			nRet = -2;
			closesocket(m_hTcpClientSocket);
			m_hTcpClientSocket = NULL;
		}
		else
		{
			nRet = sendRes;
		}
	}
	else
	{
		nRet = -1;
	}
	return nRet;
}

char ConvertHexChar(char ch)
{
	if ((ch >= '0') && (ch <= '9'))
		return   ch - 0x30;
	else   if ((ch >= 'A') && (ch <= 'F'))
		return   ch - 'A' + 10;
	else   if ((ch >= 'a') && (ch <= 'f'))
		return   ch - 'a' + 10;
	else   return   (-1);

}

int StringToHex(CString str, unsigned char* senddata)
{
	int hexdata, lowhexdata;
	int hexdatalen = 0;
	int len = str.GetLength();
	for (int i = 0; i < len;)
	{
		char lstr, hstr = str[i];
		if (hstr == ' ')
		{
			i++;
			continue;
		}
		i++;
		if (i >= len)
			break;
		lstr = str[i];
		hexdata = ConvertHexChar(hstr);
		lowhexdata = ConvertHexChar(lstr);
		if ((hexdata == 16) || (lowhexdata == 16))
			break;
		else
			hexdata = hexdata * 16 + lowhexdata;
		i++;
		senddata[hexdatalen] = (char)hexdata;
		hexdatalen++;
	}
	return hexdatalen;
}

在C#中调用该接口的时候,刚开始我是通过string down = System.Text.Encoding.Default.GetString()或者System.Text.Encoding.UTF8.GetString()的方式将字节数组转换成string然后传递给TcpClientSyn_send函数,但是这两种方法传递的字节数组到达DLL中时大于127的字节都会变为0x3f也就是63。后来果断抛弃该种方法,转而通过自定义函数BytesToHexString()将字节数组变为类似于"AA AA A0 01"这样的字符串,然后再DLL中通过另一个自定义函数StringToHex()来再次转换成字节数组。

复制代码
//C#调用DLL中的TcpClient_send函数
private static void SendThread(object n)
{
    //发送
    byte[] buffSend = { 0xAA, 0xAA, 0x70, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x17, 0xC5, 0x51, 0xE2, 0xEE, 0xEE };
    //string down = System.Text.Encoding.Default.GetString(buffSend);
    //string down = System.Text.Encoding.UTF8.GetString(buffSend);
    string HexString_down = BytesToHexString(buffSend);
    int sendLen=TcpClient_send(HexString_down, 16);
    if (sendLen> 0)
    {
    }
    
    //接收     
    uint nRecvLen;
    nRecvLen = 0;
    StringBuilder buffRecv = new StringBuilder(1024);
    buffRecv.Clear();
    int recvLen=TcpClientSyn_recv(buffRecv,ref nRecvLen);
     if (recvLen> 0)
     {
     }

}


private static string BytesToHexString(byte[] byteDatas)
{
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < byteDatas.Length; i++)
    {
        builder.Append(string.Format("{0:X2} ", byteDatas[i]));
    }
    return builder.ToString().Trim();
}
相关推荐
deng-c-f17 小时前
Linux C/C++ 学习日记(53):原子操作(二):实现shared_ptr
开发语言·c++·学习
一个不知名程序员www17 小时前
算法学习入门---结构体和类(C++)
c++·算法
MyBFuture17 小时前
C#接口与抽象类:关键区别详解
开发语言·c#·visual studio
墨雪不会编程18 小时前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
曹牧18 小时前
C#:记录日志
服务器·前端·c#
yangpipi-19 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
SunkingYang19 小时前
MFC进程间消息通信深度解析:SendMessage、PostMessage与SendNotifyMessage的底层实现与实战指南
c++·mfc·共享内存·通信·postmessage·sendmessage·进程间
XFF不秃头20 小时前
力扣刷题笔记-旋转图像
c++·笔记·算法·leetcode
王老师青少年编程20 小时前
csp信奥赛C++标准模板库STL案例应用3
c++·算法·stl·csp·信奥赛·lower_bound·标准模版库
心疼你的一切21 小时前
三菱FX5U PLC与C#通信开发指南
开发语言·单片机·c#