如何确定struct.unpack的格式(因为我不是在Python中打包)?

2 投票
2 回答
523 浏览
提问于 2025-04-16 15:05

我有一个C语言的管道客户端(直接从这个例子中获取的),当我给它字符串“first”时,它会向我的Python管道服务器发送以下消息:

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

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

有没有办法让我 a) 从上面的输出中推断出格式,或者 b) 在C语言中以和Python中一样的方式设置格式?

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

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

2 个回答

3
>>> b'f\x00i\x00r\x00s\x00t\x00\x00\x00'.decode('utf-16le')
u'first\x00'

“每个软件开发者绝对必须了解的关于Unicode和字符集的基本知识(没有借口!)”

2

你的C代码并不是在把一个结构体写入管道,而是在写一个以空字符结尾的字符串,这个字符串是用小端格式的UTF-16编码的。当你在Windows上以Unicode模式编译你的程序时,使用的就是TEXT()宏。Python能够在不使用结构模块的情况下解码这些字符串。你可以试试这个:

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无法自动推断。如果你想写一些代码来设置C中的字符串编码,可以像在Python中那样做,但这样做可能不值得你花时间。

撰写回答