2013-05-07 143 views
0

我已經在Python中編寫了一個函數來取一個有符號整數,使用二進制補碼來轉換它,然後返回十六進制值。我知道有一個hex()函數,但我希望能夠指定整數的大小。我怎樣才能提高這段代碼的質量,並且我錯過了什麼?謝謝!有符號整數到二進制補碼十六進制

#!/usr/bin/python 

int8, int16, int32, int64 = 8, 16, 32, 64 

def intToHexString(value, bits): 
    def getBitmask(bits): 
    mask = 0 
    for i in range(bits): 
     mask = (mask << 1) + 1 
    return mask 

    if not isinstance(value, (int, long)): 
    raise ValueError("'%s' is not an Integer!"%str(value)) 
    if not isinstance(bits, int) or bits % 2 != 0: 
    raise ValueError("Illegal integer size," + 
     "value %s must be divisible by 2!"%str(bits)) 
    result = value 
    bitmask = getBitmask(bits) 
    halfMask = bitmask >> 1 
    minVal, maxVal = -halfMask, halfMask-1 
    if not minVal <= result <= maxVal: 
    raise ValueError('Out of range: %d <= %d <= %d' 
     %(minVal, result, maxVal)) 
    if value < 0: 
    result = ((abs(value)^bitmask) + 1) & bitmask 
    return '%0*X'%(int(float(bits)/4), result) 

if __name__ == '__main__': 
    x, y = 280, -54 
    print intToHexString(x, int16), intToHexString(y, int8) 

此代碼應返回的值0118CA

回答

2

我會寫更是這樣的:

def int_to_hex_string(value, bits): 
    return "{0:0{1}X}".format(value & ((1<<bits) - 1), bits//4) 

if __name__ == '__main__': 
    x, y = 280, -54 
    print(int_to_hex_string(x, 16), int_to_hex_string(y, 8)) 

我不認爲你的類型檢查添加任何東西:如果值不是正確的類型,你會通過不檢查得到更適合的'TypeError',同樣,'int16'和'int8'作爲16和8的別名並不真正增加太多。

+0

幾乎完美,但你希望格式中不要'X',所以OP在輸出中獲得'CA'而不是'ca'。 – abarnert 2013-05-07 19:45:33

+0

@abarnert,謝謝。接得好。 – Duncan 2013-05-07 19:46:05

+0

對OP的評論:即使你想要一個更好的消息的錯誤,所以它並沒有提及<<'的不受支持的類型(讓用戶想知道什麼時候我嘗試使用'<<??)? ...你可能想通過捕獲一個異常並創建一個新的(理想情況下使用PEP 3134鏈接)而不是預先檢查來實現,並且使用'TypeError'而不是'ValueError'。 – abarnert 2013-05-07 19:48:35