几个小时寻找这一问题后,我找到了解决办法。
它将每十六进制数字都记为一个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
这可以更好地贴到[文档](HTTP ://stackoverflow.com/documentation)。 – Selcuk
我投票结束这个问题,因为它不是一个问题,而是一个代码示例。 – Selcuk
那么,有关于它的问题......但我还没有回应。我发现自己需要这个,并认为它可以帮助更多的人。 –