2024-10-01 02:25:32 发布
网友
如何将十六进制颜色值(如#ff3ab4)转换为三元组的RGB值,如(128, 255, 0)?在
#ff3ab4
(128, 255, 0)
前导零被省略的原因是因为字符串被转换成一个数字,当你再次尝试将这个数字表示为一个字符串时,它不会显示任何前导的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))。通过这种方式,您可以清楚地看到im使用的位掩码过滤出作为十六进制数的独立组件。在
我相当肯定,也有一些类似字符串格式化程序的东西可以将数字表示为漂亮的字符串,但我从未使用过它们,因此我无法告诉您使用这些格式的解决方案会是什么样子:)
编辑: 如果您不清楚我使用的位掩码是如何工作的,下面是一个(希望如此)简单的示例: 假设有2个字节的数据以位形式表示:
&运算符是位AND运算符。在
&
bytesAND = bytes0 & bytes1
bytesAND现在如下所示:
bytesAND
0000 0101
>>> bit32_to_bytes = lambda x: [255 & (x >> 8 * i) for i in (0,1,2,3)] >>> bit32_to_bytes(0xFFEE2200) [0L, 34L, 238L, 255L]
一些解释:
在屏蔽y = 255 & x之后,y接收数字x中低位字节的值。 y = 255 & (x >> 8 * n)->;y=x的第n个字节
y = 255 & x
y
x
y = 255 & (x >> 8 * n)
前导零被省略的原因是因为字符串被转换成一个数字,当你再次尝试将这个数字表示为一个字符串时,它不会显示任何前导的0,因为这个没有特定长度的数字不能知道它来自一个字符串,而字符串又有一定的长度。在
在您的例子中,我假设您希望将单独的A、R、B和G部分作为格式良好的字符串返回。如果您想手动执行此操作,我将执行以下操作:
请注意,这并不是以任何方式优化性能的。:) 应该直接使用整数(比如使用255而不是int(“0xFF000000”,16))。通过这种方式,您可以清楚地看到im使用的位掩码过滤出作为十六进制数的独立组件。在
我相当肯定,也有一些类似字符串格式化程序的东西可以将数字表示为漂亮的字符串,但我从未使用过它们,因此我无法告诉您使用这些格式的解决方案会是什么样子:)
编辑: 如果您不清楚我使用的位掩码是如何工作的,下面是一个(希望如此)简单的示例: 假设有2个字节的数据以位形式表示:
^{pr2}$&
运算符是位AND运算符。在bytesAND
现在如下所示:一些解释:
^{pr2}$在屏蔽
y = 255 & x
之后,y
接收数字x
中低位字节的值。y = 255 & (x >> 8 * n)
->;y=x的第n个字节相关问题 更多 >
编程相关推荐