如何确定struct.unpack的格式(因为我不是在Python中打包)?
我有一个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'
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中那样做,但这样做可能不值得你花时间。