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