Python 3中Perl的Win32::OLE::Variant与pack函数等效实现咨询
等效实现方案
1. pack() 函数修正
Perl的pack("C12", @HexBytes)作用是将12个0~255的整数打包为无符号字符组成的字节序列,Python中的等效写法你之前的逻辑是正确的,更规范的写法是使用计数前缀的格式串'12B',和'B'*12输出完全一致。如果出现输出差异可以检查InfoPacket的空白字符拆分逻辑,你使用的split()默认会拆分所有连续空白(空格、换行、制表符等),和Perl的拆分逻辑完全匹配。
2. Variant() 函数等效实现
Perl的Variant(VT_UI1, $Packet)是构造一个符合COM规范的无符号字节数组类型的变体对象,Python中需要借助pywin32的pythoncom和VARIANT模块实现:
首先导入对应依赖:
import pythoncom from win32com.client import VARIANT
等效的变体构造代码为:
VarPacket = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI1, HexBytes)
这里直接传入十六进制整数列表HexBytes即可,不需要提前调用pack打包,COM接口会自动识别这个变体类型。
完整修正后的Python代码
from win32com.client import Dispatch, VARIANT from struct import pack import pythoncom app = Dispatch("Some.Application") InfoPacket = "78 00 C4 10 95 B4 \ 00 02 31 7F 80 FF" Bytes = InfoPacket.split() HexBytes = [int(b, 16) for b in Bytes] # 等效Perl pack("C12"),不需要单独使用Packet可以省略这一步 Packet = pack('12B', *HexBytes) # 等效Perl Variant(VT_UI1, $Packet) VarPacket = VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_UI1, HexBytes) InfoObj = app.ProcessPacket(VarPacket) print(InfoObj.Text())
内容的提问来源于stack exchange,提问作者Abdur Rahman Haider
相关产品推荐
相关产品推荐

