Android签名int到unsigned int转换

时间:2016-07-24 10:10:11

标签: android colors unsigned-integer

我正在尝试将带符号的十进制转换为无符号小数,但我不知道该怎么做。

Android设备正在与另一台iOS设备通信,我们需要将颜色代码从一个平台发送到另一个平台。由于这些平台具有不同的数据类型(Java签名数据类型和iOS无符号数据类型),因此我们需要进行转换以使两边都具有相同的颜色。

这是我到目前为止所做的:

// Parse and retrieve color code from the backend server
int unsignedColor = getColorFromBackend();

// Now add an alpha channel 'FF' and make it unsigned color
int signedColor = toSignedColor(unsignedColor);
// The signed value is -14701818

// Now try to make the conversion back, from signed to unsigned
int conversion = toUnsignedColor(signedColor);
// The value is: 129712 which is not the value I want (2075398)

private int toUnsignedColor(int signedColor) {
   String hex = Integer.toHexString(signedColor);
   hex = hex.substring(2, hex.length() - 1);
   // hex = "1FAB06";

   int unsignedInt = Integer.parseInt(hex, 16);
   return unsignedInt;
}

private int toSignedColor(int unsignedColor) {
   String hexColor = String.format("#%06X", (0xFFFFFFFF & unsignedColor));
   // hexColor = "#FF1FAB06";
   int signedColor = Color.parseColor(hexColor);
   return signedColor;
}

// This is an example
private int getColorFromBackend() {
   return 2075398;
}

2 个答案:

答案 0 :(得分:1)

在没有签名/无符号问题的情况下,在json中传递颜色的最佳和最清晰的方法是将它们作为十六进制字符串传递。
这也将使json颜色值更容易理解。

答案 1 :(得分:0)

我设法通过移位位来将有符号整数值转换回无符号:

// 2075398;
int unsigned = parseColor("color_code");

// -14701818
int signedColor = unsigned | (0xFF << 24);

// Now convert back to signed integer, wihch is: 2075398 (no alpha)
int converted = signedColor & ((1 << 24) - 1);


// With alpha
view.setColor(signedColor);