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

时间:2019-05-31 09:40:25

标签: python c++ ctypes

我正在使用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和其他几种类型设置了返回值类型,但是结果并没有多大意义。

2 个答案:

答案 0 :(得分:3)

  

2个较高的字节表示主要版本,2个较低的字节表示次要版本,例如0x00030000表示版本为3.0。

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

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

在您的情况下,hex(393216)返回'0x60000'-即0x0为2个低字节(次要版本),而0x6为2个低字节(主要版本),给出6.0版本

编辑:

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

因此,专业是your_number>>16,次要是your_number - (your_number>>16<<16)

答案 1 :(得分:1)

后处理您的数字以提取高16位和低16位并将其格式化为字符串。以下是使用Python 3.6+ f字符串的示例:

>>> dword = 393216
>>> hex(dword)
'0x60000'
>>> f'{dword>>16}.{dword&0xFFFF}'
'6.0'
>>> dword = 0x00020003
>>> f'{dword>>16}.{dword&0xFFFF}'
'2.3'