2017-04-27 95 views
-2

问:如何将HexString转换为带符号或无符号的无前缀掩码长度? [Python的]

如何转换的hexstring为INT签署或不Python中的前缀掩码长度无符号?

是啊...已经存在这方面的主题。但是这个规范的答案不够完整或不完整。 我只是想传递一个字符串 - 没有更多 - 并得到它的等效(有符号或无符号,任何大小)。

例子:

Passing FFFFFFFFFFFFFFFFF 
Getting -1 

Passing 9F1281F0 
Getting -1626177040 

Passing 1234 
Getting 4660 
+0

这可以更好地贴到[文档](HTTP ://stackoverflow.com/documentation)。 – Selcuk

+1

我投票结束这个问题,因为它不是一个问题,而是一个代码示例。 – Selcuk

+0

那么,有关于它的问题......但我还没有回应。我发现自己需要这个,并认为它可以帮助更多的人。 –

回答

0

几个小时寻找这一问题后,我找到了解决办法。

它将每十六进制数字都记为一个4位整数,虽然这并非总是如此,但它也不会成为问题。

例如:0x7是0b111。所以,Python中的整数将有3位。请与:

a = 7 
print(a.bit_length()) 
#3 

但如果从最显著数字(信号位)没有第四位,它会为0计算,这正是我们希望在这种情况下。

所以,代码(未优化),但最清晰我可以提出的是:

HEX_BITS = 4 

def shift_left1(bits): 
    #Left shift adding 1 instead of 0 
    mask = 0 
    for i in range(bits): 
     mask = (mask << 1) + 1 
    return mask 

def hex_signal(value, bits): 
    # Retuns the mask with bit signal 
    signal_mask = 1 << bits 
    return -(value & (signal_mask)) 

def hex_without_signal(value, bits): 
    # Returns value with the number of bits given (from less significant to most) 
    return value & shift_left1(bits) 

def hex2dec(hstring, signed=True): 
    value = int(hstring, 16) 
    if signed: #Do we want to check the signal? 
     value_bits = len(hstring) * HEX_BITS # A full hex digit have four bits 
     shift_times = value_bits - 1 # Times to subfunctions shifts 
     signal_mask = hex_signal(value, shift_times) # Mask with bit value setted 
     unsigned_hex_mask = hex_without_signal(value, shift_times) # Value without most significant bit 
     return signal_mask | unsigned_hex_mask # Or bit a bit from the unsigned value and signal mask 
    else: # If not just returns the native conversion 
     return value 

实例:

print(hex2dec("2")) 
#2 
print(hex2dec("E")) 
#-2 
print(hex2dec("4")) 
#4 
print(hex2dec("FF")) 
#-1 
print(hex2dec("0F")) 
#15 
print(hex2dec("1F")) 
#31 
print(hex2dec("1234")) 
#4660 
print(hex2dec("9F1281F0")) 
#-1626177040 
相关问题