如何在 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 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中将列表转换为带有空格的字符串?

如何在 Python 中将字符串转换为 utf-8

如何在python中将异常转换为字符串[重复]

如何在python中将数组字符串转换为数组[重复]

如何在 Python 中将 JSON 字符串转换为字典?

如何在 Python 中将字典转换为查询字符串?