如何将 DWORD 转换为 Python 中的字符串

How to convert DWORD to string in Python

我正在使用 Python 开发 C++ SDK。其中一个 API 看起来像这样

API

DWORD NET_DVR_GetSDKVersion(
);

文档

2 higher bytes mean the major version, 2 lower bytes mean the minor version, e.g. 0x00030000 means version 3.0.

它 return 是一个 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 和其他几种类型设置了 return 值类型,但结果并没有多大意义。

2 higher bytes mean the major version, 2 lower bytes mean the minor version, e.g. 0x00030000 means version 3.0.

如您在示例中所见,数字采用十六进制格式(0x 前缀)。在十六进制格式中,您可以轻松看到字节 - 2 个十六进制数字 = 1 个字节(因为 16*16 是 256)。

您需要使用 hex(your_value_here) 将您的号码转换为十六进制,并将其分为主要版本和次要版本的两部分。

在你的情况下 hex(393216) returns '0x60000' - 即 0x0 作为 2 个低字节(次要版本)和 0x6 作为高字节(主要版本), 给出版本 6.0

编辑:

您还可以使用二进制操作提取您的版本。使用 your_number_here>>16 将您的数字向右移动 16 位(2 字节),即删除较低的 2。

所以专业是 your_number>>16,辅修是 your_number - (your_number>>16<<16)

Post 处理您的数字以提取高 16 位和低 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'