[英]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'
您的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.