如何将十六进制颜色转换为smali颜色(在Java中)?
如何将十六进制中的颜色值转换为smali颜色(和背面)?例如:如何将十六进制颜色转换为smali颜色(在Java中)?,java,android,colors,hex,smali,Java,Android,Colors,Hex,Smali,如何将十六进制中的颜色值转换为smali颜色(和背面)?例如:#ff212121(十六进制)->-0xdededf(smali)#df3192b8->-0x20ce6d48等 将颜色中的所有数字从“f”中进行十六进制减法 在新的十六进制数前面预先附加-0x 没有必要转换任何东西。如果十六进制代码是#df3192b8,则可以使用0xdf3192b8 smali中的32位整数常量可以用介于-2^31和2^32-1之间的值指定(而不是2^31-1)。基本上,它是可能的有符号和无符号32位值的组合 当然
#ff212121
(十六进制)->-0xdededf
(smali)#<代码>df3192b8->-0x20ce6d48
等
没有必要转换任何东西。如果十六进制代码是
#df3192b8
,则可以使用0xdf3192b8
smali中的32位整数常量可以用介于-2^31
和2^32-1
之间的值指定(而不是2^31-1
)。基本上,它是可能的有符号和无符号32位值的组合
当然,由于java只有带符号的整数,当您指定2^31
-2^32-1
范围内的值时,虚拟机会将其解释为负数,这是baksmali在反汇编类时使用的默认表示形式。这就是为什么在反汇编中会看到像-0x20ce6d48
这样的值,而不是0xdf3192b8
。但这两个值生成相同的字节码/指定相同的颜色
为了“转换回”,如果值为正值,则无需执行任何操作。如果该值为负值,只需将
0x100000000
添加到该值即可。e、 g.-0x20ce6d48+0x100000000=0xdf3192b8
,因此-0x20ce6d48
的值对应于#df3192b8
的十六进制颜色代码。这比我想象的要容易。奇怪的是,我在谷歌搜索时没有找到这个链接。非常感谢。这个链接是不正确的。最终得到的颜色与原始颜色相差1。无需将十六进制颜色代码转换为其签名表示形式。更多细节请参见我的答案。另外,您描述的是1的补码,但有符号整数使用2的补码表示,因此您的转换为1。