如何在 Python 中将 DWORD 转换为字符串
Posted
技术标签:
【中文标题】如何在 Python 中将 DWORD 转换为字符串【英文标题】:How to convert DWORD to string in Python 【发布时间】:2019-05-31 09:40:25 【问题描述】:我正在使用 Python 开发 C++ SDK。其中一个 API 如下所示
API
DWORD NET_DVR_GetSDKVersion(
);
文档
2 个高字节表示主要版本,2 个低字节表示次要版本,例如0x00030000 表示版本 3.0。
它返回一个DWORD
值。我做了一些研究,似乎DWORD
等于 Python 中的ctypes.c_ulong
。
但是,我从 API 中得到的只是一个整数 393216
,这没有多大意义。
代码
sdk = cdll.LoadLibrary("sdk.so")
sdk.NET_DVR_GetSDKVersion.restype = ctypes.c_long
result = sdk.NET_DVR_GetSDKVersion()
我已经使用c_char_p
和其他几种类型设置了返回值类型,但结果并没有多大意义。
【问题讨论】:
【参考方案1】:2 个高字节表示主要版本,2 个低字节表示次要版本,例如0x00030000 表示版本 3.0。
正如您在示例中看到的,数字是十六进制格式(0x 前缀)。在十六进制格式中,您可以轻松查看字节 - 2 个十六进制数字 = 1 个字节(因为 16*16 是 256)。
您需要使用hex(your_value_here)
将您的数字转换为十六进制,并将其分成主要和次要版本的两部分。
在您的情况下,hex(393216)
返回 '0x60000'
- 即 0x0
作为 2 个低字节(次要版本)和 0x6
作为高字节(主要版本),给出版本 6.0
编辑:
您还可以使用二进制操作提取您的版本。使用your_number_here>>16
将您的数字向右移动 16 位(2 个字节),即移除低 2。
所以主要是your_number>>16
,次要是your_number - (your_number>>16<<16)
。
【讨论】:
【参考方案2】:后处理您的号码以提取高低 16 位并将它们格式化为字符串。以下是使用 Python 3.6+ f-strings 的示例:
>>> dword = 393216
>>> hex(dword)
'0x60000'
>>> f'dword>>16.dword&0xFFFF'
'6.0'
>>> dword = 0x00020003
>>> f'dword>>16.dword&0xFFFF'
'2.3'
【讨论】:
以上是关于如何在 Python 中将 DWORD 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章