Python與C 資料互動編碼問題

2021-07-24 18:52:13 字數 1202 閱讀 7038

在寫後台的時候遇到乙個需求:

我的python後台伺服器需要建立乙個服務端socket跟c++客戶端進行一些資料的互動

出現問題:

python socket.recv(1024)接收到的資料是格式不正確的。

比如客戶端傳過來的資料格式是「4,10080」

服務端接收到的資料格式是「 4, 1 0 0 8 0」

分析問題:

客戶端傳輸過來的資料型別是unicode,但是並不知道是什麼樣的編碼解碼型別,坑!!!非常坑!!!

然後列印python接收到的初始資料發現是str型別,說明了python的socket.reccv()對資料流進行了編碼

於是在嘗試了n種解碼方式以後終於發現,用「utf-16」的解碼方式能夠從原始接收資料中得到正確的unicode資料

第二波問題:

在獲取到正確的unicode資料進行多種方式編碼,發現編碼後的string資料都是「4, 10080/x00」

第二波分析問題:

因為未知客戶端那邊的編碼解碼方式,是不是因為我的編碼方式和客戶端的解碼方式是不一樣的,所以取到的資料是不正確的

結論:

1. unicode的出現是在c和c++之後,也就是說c和c++的unicode資料預設是沒有編碼解碼型別,但是人為強加轉換好像也是可以的,這點我不確定。所以「我的編碼方式和客戶端的編碼方式不一致導致問題」的猜想是不對的。

2. c++的客戶端程式是mfc程式,發過來的資料型別是cstring,c++的字串是以/0字元結尾的,所以/x00應該是結束符的轉換導致的結果,後來換了別的資料也是同樣有一樣的後面字元,加深了我對這個猜想的認證

吸取教訓:

1. 不同的程式語言之間進行資料的互動時,特別是有中文資料的時候!!如果使用的是python,一定要了解好編碼和解碼的字符集型別,是utf-8還是gbk或者其他,這個處理會減少很多不必要的bug

2. 在除錯的時候,如果是在cmd視窗除錯,也要注意顯示的程式的預設字符集,因為cmd的視窗預設字符集型別是gbk,如果是utf16的資料在上面顯示就是會不正常的,最好是有資料匹配,不一定眼見為實

python與cad互動 python與C 互動

python和c 能進行有效的互動,c 呼叫python的一些小用法 寫了乙個python指令碼匯入發生異常,可能是編碼問題 如存在中文 python預設的是ascii 可加上 usr bin python coding utf 8 參見 定義類c資料結構 class point structure...

C 與EXCEL的資料互動

excel的呼叫,如果不熟悉,請參考msdn中的 使用 excel物件模型實現 excel自動化 一 datatable to excel 先定義一下 private private private excel.worksheet excelsheet excel.worksheet excelbo...

C與Python互動ctype方式記錄

python中封裝了ctype可以用來c與python之間的互動。在vs中選擇動態庫編譯可以將函式編譯成動態庫的形式。下面條件編譯是用來在c 中編譯c的函式,並且匯出成動態庫的。ifdef cplusplus define xext extern c else define xext endif i...