2012-06-18 75 views

回答

1
>>> bit32_to_bytes = lambda x: [255 & (x >> 8 * i) for i in (0,1,2,3)] 
>>> bit32_to_bytes(0xFFEE2200) 
[0L, 34L, 238L, 255L] 

一些說明:

>>> bin(0xFF00) 
'0b1111111100000000' # this is string, not a number 
>>> bin(0xFF00 >> 8) # shift right by 8 bits 
'0b11111111' # leading zeros striped 
>>> bin(0xA0FF00) 
'0b101000001111111100000000' # 24-bit number 
>>> bin(0xA0FF00 >> 8) # shift by 1 byte (drop the lowest byte) 
'0b000000001010000011111111' # leading zeros added by myself! 
>>> bin(255 & (0xA0FF00 >> 8)) # shift right (by 1 byte) and mask (get last byte) 
'0b000000000000000011111111' # leading zeros added by myself! 

掩蔽y = 255 & x後,y接收數x低字節的值。 y = 255 & (x >> 8 * n) - > Y = n個字節從X

2

爲什麼被省略前導零點的原因是因爲字符串被轉換爲數字,當你試圖表現爲一個字符串再次數量也不會顯示任何前導0,因爲沒有一定長度的數字不能知道它來自一個字符串,而字符串又有一定的長度。

在你的情況,我假設你想返回單獨的A,R,B和G部分作爲一個很好格式化的字符串。如果你想手動做到這一點,我將做到以下幾點:

def colorComponents(hexAsString): 
    def uniformLength(string): 
     return string[:2] + "".zfill(10-len(string)) + string[2:] 
    re = [] 
    re.append(str(hex(int(hexAsString, 16) & int("0xFF000000", 16)))) 
    re.append(str(hex(int(hexAsString, 16) & int("0x00FF0000", 16)))) 
    re.append(str(hex(int(hexAsString, 16) & int("0x0000FF00", 16)))) 
    re.append(str(hex(int(hexAsString, 16) & int("0x000000FF", 16)))) 

    for i in range(len(re)): 
     re[i] = uniformLength(re[i]) 
    return re 

請注意,這不是最優化的性能代價以任何方式。 :) 你應該立即使用整數(如使用255而不是int(「0xFF000000」,16))。這種方式雖然你可以清楚地看到我使用的位掩碼將單獨的組件過濾掉爲十六進制數字。

我相當肯定有像字符串格式化程序這樣的東西,可以做數字表示爲漂亮的字符串的工作,但我從來沒有使用它們,所以我不能告訴你如何解決這些問題: )

編輯: 如果它是不清楚你的位掩碼是如何工作的,我用,這裏的(希望)簡單的例子: 假設你有2個字節在其位形式表示的數據:

bytes0 = 0011 0101 
bytes1 = 0000 1111 

&運算符是一個按位運算符。

bytesAND = bytes0 & bytes1 

bytesAND現在看起來是這樣的:

0000 0101 
相關問題