簡體   English   中英

如何找出struct.unpack的格式(因為我沒有在Python中打包)?

[英]How do I figure out the format for struct.unpack (because I didn't pack in Python)?

我有一個C管道客戶端(直接從此處找到的CallNamedPipe示例中拉出),如果給定字符串“ first”,則將以下消息發送到我的Python管道服務器:

b'f\x00i\x00r\x00s\x00t\x00\x00\x00'

struct文檔提供了一些示例,其中我使用Python進行了打包和拆包。 那意味着我知道格式,因為我在調用struct.pack時明確指定了格式。

我有什么方法可以a)從上述輸出中推斷格式,或者b)以與Python中相同的方式在C中設置格式?

以下是相關的客戶端代碼:

    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\testpipe");
    LPTSTR lpszWrite = TEXT("first");
    fSuccess = CallNamedPipe( 
          lpszPipename,        // pipe name 
          lpszWrite,           // message to server 
    ...
>>> b'f\x00i\x00r\x00s\x00t\x00\x00\x00'.decode('utf-16le')
u'first\x00'

“每個軟件開發人員絕對,肯定必須絕對了解Unicode和字符集(沒有任何借口!)”

您的C代碼未在管道中寫入結構,而是在編寫以小尾數UTF-16文本編碼的空終止字符串,當您以Unicode模式編譯Windows程序時,該字符串由TEXT()宏生成。英特爾CPU。 Python知道如何在不使用struct模塊的情況下解碼這些字符串。 嘗試這個:

null_terminated_unicode_string = data.decode('utf-16le')
unicode_string = null_terminated_unicode_string[:-1]

如果您的python代碼與寫入數據的C程序在相同的CPU體系結構上運行,則可以使用decode('utf-16') 您可能想閱讀python的unicode編解碼器

編輯:您可以通過知道UTF-16和Windows字符串宏如何工作來推斷該數據的類型,但是python無法推斷出來。 如果想編寫一些代碼,可以像在python中一樣設置C語言中的字符串編碼,但這可能不值得花時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM