2016-07-24 19 views
0

Ich versuche, eine vorzeichenbehaftete Dezimalzahl in eine Dezimalzahl ohne Vorzeichen zu konvertieren, aber ich weiß nicht, wie das geht.Android signed int zu unsigned Int-Konvertierung

Das Android-Gerät kommuniziert mit einem anderen iOS-Gerät, und wir müssen Farbcodes von einer Plattform zur anderen senden. Da diese Plattformen unterschiedliche Datentypen aufweisen (Java-signierte Datentypen und nicht signierte iOS-Datentypen), müssen Konvertierungen vorgenommen werden, um auf beiden Seiten die gleichen Farben zu erhalten.

Das ist, was ich bisher gemacht habe:

// 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; 
} 
+0

'Versuch, eine Dezimalzahl mit Vorzeichen auf eine unsigned decimal' zu konvertieren. Du meinst: signed integer to unsigned integer? Bitte geben Sie ein Beispiel. Und zeigen Sie, warum das problematisch wäre. – greenapps

+0

Ich frage mich, wie Sie die Daten zwischen Android ein IOS senden. Da Sie vier Bytes in jeder Richtung senden würden, würde ich für eine ganze Zahl denken. Sei es signiert oder nicht signiert. – greenapps

+0

Bitte geben Sie ein Beispiel für den Empfang von Daten von IOS, die problematisch ist. – greenapps

Antwort

1

Der beste und klarste Weg in json, ohne mit/ohne Vorzeichen Ausgaben Farben zu passieren, ist sie als Hex-String zu übergeben.
Dadurch wird auch der Json-Farbwert verständlicher.

0

Ich habe es geschafft, die signierten Integer-Wert zurück in unsigned zu konvertieren, indem die Bits Verschiebung:

// 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); 
+0

Dieser Code ist lächerlich, da Sie gerade das Alpha vollständig entfernen oder auf 255 setzen und nichts mit dem ursprünglichen Alpha-Wert zu tun haben. Der einzige richtige Weg, dies zu tun, ist, und es ist einfach, es aus dem JSON als Long zu lesen und dann auf einen int zu werfen. Auf diese Weise wird der positive Wert ohne Vorzeichen korrekt gelesen. Wenn Sie ihn dann umsetzen, wird er in einen vorzeichenbehafteten (möglicherweise negativen) int-Wert umgewandelt. – lionscribe

Verwandte Themen