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.pswp.cn/news/40763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40763.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stable diffusion安裝包和超火使用文檔,數字人制作網址

一&#xff1a;文生圖、圖生圖 1&#xff1a;stable diffusion&#xff1a;對喜歡二次元、美女小姐姐、大眼萌妹的人及其友好哈哈(o^^o) 1&#xff09;&#xff1a;秋葉大神安裝包和模型包&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/11_kguofh76gwhTBPUipepw 提…

機器學習 | Python實現GBDT梯度提升樹模型設計

機器學習 | Python實現GBDT梯度提升樹模型設計 目錄 機器學習 | Python實現GBDT梯度提升樹模型設計基本介紹模型描述模型使用參考資料基本介紹 機器學習 | Python實現GBDT梯度提升樹模型設計。梯度提升樹(Grandient Boosting)是提升樹(Boosting Tree)的一種改進算法,GBDT也…

Java System.arraycopy() 對比 C++ memcpy()

System.arraycopy() java.lang.System類為標準輸入和輸出、加載文件和庫或訪問外部定義的屬性提供了有用的方法。 java.lang.System.arraycopy&#xff08;&#xff09;方法將源數組從特定的起始位置復制到上述位置的目標數組。要復制的參數的數量由一個參數決定。 source_Pos…

前端文件下載通用方法

zip文件和xlsx文件 import axios from axios import { getToken } from /utils/authconst mimeMap {xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,zip: application/zip }const baseUrl process.env.VUE_APP_BASE_API // zip下載 export functi…

214、仿真-基于51單片機溫度甲醛一氧化碳(co)電機凈化報警Proteus仿真設計(程序+Proteus仿真+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選擇 方案一&a…

It‘s likely that neither a Result Type nor a Result Map was specified.

問題&#xff1a; org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were 原因&#xff1a; 由于傳遞參數給 mapper 映射文件&#xff0c;所以必須要指定參數數據格式 如…

Qt+Pyhton實現麒麟V10系統下word文檔讀寫功能

目錄 前言1.C調用python1.1 安裝Python開發環境1.2 修改Qt工程配置1.3 初始化Python環境1.4 C 調用Python 函數1.5 常用的Python接口 2.python虛擬環境2.1Python虛擬環境簡介2.2 virtualenv 安裝及使用2.3 在C程序中配置virtualenv 虛擬環境 3.python-docx庫的應用4.總結 前言 …

神經網絡基礎-神經網絡補充概念-23-神經網絡的梯度下降法

概念 神經網絡的梯度下降法是訓練神經網絡的核心優化算法之一。它通過調整神經網絡的權重和偏差&#xff0c;以最小化損失函數&#xff0c;從而使神經網絡能夠逐漸逼近目標函數的最優值。 步驟 1損失函數&#xff08;Loss Function&#xff09;&#xff1a; 首先&#xff0c…

Springboot多路數據源

1、多路數據源配置 &#xff08;1&#xff09;SpringBootMyBatis-PlusOracle實現多數據源配置 https://blog.csdn.net/weixin_44812604/article/details/127386828 &#xff08;2&#xff09;SpringBootMybatis搭建Oracle多數據源配置簡述 https://blog.csdn.net/HJW_233/arti…

網絡安全 Day29-運維安全項目-iptables防火墻

iptables防火墻 1. 防火墻概述2. 防火墻2.1 防火墻種類及使用說明2.2 必須熟悉的名詞2.3 iptables 執行過程※※※※※2.4 表與鏈※※※※※2.4.1 簡介2.4.2 每個表說明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 環境準備及命令2.6 案例01&#xff1a…

神經網絡基礎-神經網絡補充概念-31-參數與超參數

概念 參數&#xff08;Parameters&#xff09;&#xff1a; 參數是模型內部學習的變量&#xff0c;它們通過訓練過程自動調整以最小化損失函數。在神經網絡中&#xff0c;參數通常是連接權重&#xff08;weights&#xff09;和偏置&#xff08;biases&#xff09;&#xff0c;…

ChatGLM2-6B安裝部署(詳盡版)

1、環境部署 安裝Anaconda3 安裝GIT 安裝GUDA 11.8 安裝NVIDIA 圖形化驅動 522.25版本&#xff0c;如果電腦本身是更高版本則不用更新 1.1、檢查CUDA 運行cmd或者Anaconda&#xff0c;運行以下命令 nvidia-smi CUDA Version是版本信息&#xff0c;Dricer Version是圖形化…

LeetCode 160.相交鏈表

文章目錄 &#x1f4a1;題目分析&#x1f4a1;解題思路&#x1f6a9;步驟一&#xff1a;找尾節點&#x1f6a9;步驟二&#xff1a;判斷尾節點是否相等&#x1f6a9;步驟三&#xff1a;找交點&#x1f344;思路1&#x1f344;思路2 &#x1f514;接口源碼 題目鏈接&#x1f449;…

Ubuntu下mysql安裝及遠程連接支持配置

1.安裝 下載mysql-server&#xff08;必須加sudo&#xff09; sudo apt update sudo apt install mysql-server 查看mysql的狀態 sudo service mysql status 通過如下命令開啟mysql sudo service mysql start 2.配置 第一次安裝mysql后&#xff0c;為root設置一個密碼 …

Linux -- 進階 Autofs應用 : 光驅自動掛載 操作詳解

服務端自動掛載光驅 第一步 &#xff1a; 關閉安全軟件&#xff0c;安裝自動掛載軟件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# yum install autofs -y 第二步 &#xff1a; 修改 autofs 主配置文件&#xff0c; 計劃掛載光…

C++之map的emplace與pair插入鍵值對用例(一百七十四)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 人生格言&#xff1a; 人生…

213、仿真-基于51單片機智能電表電能表用電量電費報警Proteus仿真設計(程序+Proteus仿真+原理圖+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、原理圖 五、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選…

uniapp tabbar 瀏覽器調試顯示 真機不顯示

解決方案&#xff0c;把tabBar里面的單位全改為px&#xff0c;rpx是不會顯示的&#xff01; 注意了&#xff0c;改完一定要重新運行&#xff0c;不然無效&#xff0c;坑爹 "tabBar": {"borderStyle": "black","selectedColor": &quo…

java-JVM內存區域JVM運行時內存

一. JVM 內存區域 JVM 內存區域主要分為線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區域【JAVA 堆、方法區】、直接內存。線程私有數據區域生命周期與線程相同, 依賴用戶線程的啟動/結束 而 創建/銷毀(在 HotspotVM 內, 每個線程都與操作系統的本地線程直接映…

SwiftUI 動畫進階:實現行星繞圓周軌道運動

0. 概覽 SwiftUI 動畫對于優秀 App 可以說是布帛菽粟。利用美妙的動畫我們不僅可以活躍界面元素,更可以單獨打造出一整套生動有機的世界,激活無限可能。 如上圖所示,我們用動畫粗略實現了一個小太陽系:8大行星圍繞太陽旋轉,而衛星們圍繞各個行星旋轉。 在本篇博文中,您將…