2017-04-27 27 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 
相關問題