如何将十六进制颜色转换为smali颜色(在Java中)?

如何将十六进制颜色转换为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位值的组合 当然

如何将十六进制中的颜色值转换为smali颜色(和背面)?例如:
#ff212121
(十六进制)->
-0xdededf
(smali)#<代码>df3192b8->
-0x20ce6d48

  • 将颜色中的所有数字从“f”中进行十六进制减法
  • 在新的十六进制数前面预先附加-0x

  • 没有必要转换任何东西。如果十六进制代码是
    #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。