2012-06-18 55 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 
相关问题