我如何找出struct.unpack的格式(因为我没有用Python包装)?

时间:2011-04-04 21:19:36

标签: python python-3.x

我有一个C管道客户端(直接从找到here的CallNamedPipe示例中提取),如果给定字符串“first”,则将以下消息发送到我的Python管道服务器:

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

struct documentation给出了我在Python中进行打包和解包的示例。这意味着我知道格式,因为我在调用struct.pack时明确指定了它。

我有什么方法可以a)从上面的输出中推断出格式,或者b)用C中的格式设置C中的格式?

以下是相关的客户端代码:

    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\testpipe");
    LPTSTR lpszWrite = TEXT("first");
    fSuccess = CallNamedPipe( 
          lpszPipename,        // pipe name 
          lpszWrite,           // message to server 
    ...

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

你的C代码没有在管道上写一个结构,它正在编写一个以null结尾的UTF-16文本编码的以空字符结尾的字符串,当你编译你的Windows程序时由TEXT() macro生成Intel CPU的Unicode模式。 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 codecs

编辑:您可以通过了解UTF-16和Windows字符串宏如何工作来推断该数据的类型,但是python无法推断它。您可以像在python中那样设置C语言中的字符串编码,如果您想编写一些代码来执行此操作,但它可能不值得您花时间。