我有一个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
...
答案 0 :(得分:2)
>>> b'f\x00i\x00r\x00s\x00t\x00\x00\x00'.decode('utf-16le')
u'first\x00'
答案 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语言中的字符串编码,如果您想编写一些代码来执行此操作,但它可能不值得您花时间。