繁体   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