当前位置: 首页 > news >正文

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;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();
}

http://www.lryc.cn/news/127827.html

相关文章:

  • 【vue3+xlxs+xlsx-style-vite】vue3项目中使用xlsx插件实现Excel表格的导出和解析,已实现
  • Doris2.0时代的一些机遇和挑战!
  • Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】
  • 网神 SecGate 3600 防火墙任意文件上传漏洞复现
  • 把独显塞回CPU,新核显能够媲美RTX 30、40系显卡了
  • Python爬虫——scrapy_工作原理
  • gRPC vs REST:创建API的方法比较
  • 缓存平均的两种算法
  • SpringBoot的配置文件(properties与yml)
  • 如何应用项目管理软件进行敏捷开发管理
  • ARM DIY 硬件调试
  • DataFrame.rename()函数--Pandas
  • 09- DMA(DirectMemoryAccess直接存储器访问)
  • 责任链模式
  • 【BI看板】Docker-compose安装Superset,安装最新版本2.1.0
  • VS2019生成的DLL,给QT(MinGW版本)使用的小结
  • c++--SLT六大组件之间的关系
  • 解析个人信息保护影响评估
  • 2.阿里云对象存储OSS
  • (三)Unity开发Vision Pro——入门
  • 召集令:CloudQuery 社区有奖征文活动来啦!
  • 【傅里叶级数与傅里叶变换】数学推导——1、基础知识点回顾及[Part1:三角函数的正交性]介绍
  • BUUCTF [MRCTF2020]Ezpop解题思路
  • 【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树
  • 深度学习中的python语法笔记总结
  • Reids 的整合使用
  • Vue3 —— watchEffect 高级侦听器
  • Java异步子线程读取主线程参数的若干好玩场景
  • Android 视频开发
  • 【计算机网络篇】UDP协议