幾個小時尋找這一問題後,我找到了解決辦法。
它將每十六進制數字都記爲一個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
那麼,有關於它的問題......但我還沒有迴應。我發現自己需要這個,並認爲它可以幫助更多的人。 –