Python 十六进制字符串到两个18位整数

Python 十六进制字符串到两个18位整数,python,integer,hex,bit,Python,Integer,Hex,Bit,我不熟悉十六进制,以前找不到类似的帖子。例如,我有一个十六进制字符串50f116bcf,b3b4d25d0,它是一个36位整数。不确定它是签名的还是未签名的。我想知道如何在python中将十六进制的38位整数转换为两个18位整数 在这篇文章中,我看到了使用 def twos_complement(hexstr,bits): value = int(hexstr,16) if value & (1 << (bits-1)): value -

我不熟悉十六进制,以前找不到类似的帖子。例如,我有一个十六进制字符串
50f116bcf
b3b4d25d0
,它是一个36位整数。不确定它是签名的还是未签名的。我想知道如何在python中将十六进制的38位整数转换为两个18位整数

在这篇文章中,我看到了使用

def twos_complement(hexstr,bits):
     value = int(hexstr,16)
     if value & (1 << (bits-1)):
         value -= 1 << bits
     return value

twos_complement('FFFE',16)
-2
这也可以推广到使用下面的方法将一个已知的38位整数拆分为两个16位整数吗

c = (x >> 16) & 0xff
f = x & 0xff

假设一个十六进制字符串代表一个正整数,您只需将最后两行修改为

>>值=0x50f116bcf
>>>msb=(值>>18)和(2**18-1)
>>>lsb=值&(2**18-1)
#并使用二进制或
>>>(msb>idx*位)&范围内idx的掩码(num)]
fmtstr=f'{:0{bits}b}'
返回[fmtstr.format(v)for v in reversed(blocks)]
为了将36位数字拆分为两个18位数字:

bin_石斑鱼(0x50f116bcf,18) ['010100001111000100', '010110101111001111'] #或 >>>斑石斑鱼(国际标准('50f116bcf',16),18) ['010100001111000100', '010110101111001111'] 为了比较结果,您可以将
0x50f116bcf
转换为36位二进制字符串,并测试高位18位(msb)和低位18位(lsb):

>>bstr=f'{0x50f116bcf:036b}'
>>>bstr
'010100001111000100010110101111001111'
>>>blocks=bin_石斑鱼(0x50f116bcf,18)
>>>块[0]==bstr[:18]==f'{msb:018b}'
真的
>>>块[1]==bstr[18::==f'{lsb:018b}'
真的

这是一个基本转换器:

def getbasetasifintisbaset(orig,basefrom=10, baseto=16):
   num=orig
   result = 0
   i=0
   while num != 0:
       result += (num % basefrom) * (baseto ** i) 
       num //=basefrom
       i += 1
   return result 

getbasetasifintisbaset(100,10,16)                                                                                                                                   
#256

getbasetasifintisbaset(256,16,10)                                                                                                                                   
#100

有些地方说36位整数,有些地方说38位整数。是哪一个?你能告诉他如何将这两个18位的数字恢复到36位吗?:-)顺便说一句,这篇文章写得不错。我想这会对他有所帮助,因为他可以确认结果。仅供参考:ceil操作可以使用
num=-(value.bit\u length()//-bits)
谢谢fhgd,关于stackoverflow这个问题的许多答案都不是很有帮助,我想你的答案会帮助很多搜索这个主题的人。
def getbasetasifintisbaset(orig,basefrom=10, baseto=16):
   num=orig
   result = 0
   i=0
   while num != 0:
       result += (num % basefrom) * (baseto ** i) 
       num //=basefrom
       i += 1
   return result 

getbasetasifintisbaset(100,10,16)                                                                                                                                   
#256

getbasetasifintisbaset(256,16,10)                                                                                                                                   
#100