? 最近做了一個網絡編程的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;elsehexdata = 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();
}