2016-05-27 9 views
-2

Ich arbeite mit einigen Low-Capacity-Modul und ich muss die Daten so viel wie möglich komprimieren. Die Daten werden wie folgt aussehen:Java: benutzerdefinierte to Byte-Konvertierungen

DeviceEvent:

  • 1 Byte:
    • 2 Bits für den Status (00 jedes Mal)
    • 6 Bits für RGB-Farbe (3 x 2 Bits)
  • 2 Bytes Anzahl von Minuten ab jetzt bis zu einer gewissen Datumzeit

Ich brauche einen Konstruktor (vorzugsweise 2 Konstrukteurs) für die Konvertierung von/zu erstellen:

Veranstaltung:

  • byte [] Farbe (rgb, werden Farben nur 64 verfügbar vereinfacht werden)
  • einige Datetime (aber ich werde die ganze Zahl für Differenz in Minuten erhalten und es wird klein genug sein, in zwei Bits zu passen)

Also im Grunde brauche ich:

  • byte [3] Farbe < -> 1 Byte Status und Farbe
  • int Minuten < -> byte [2] Minuten

Ich werde für jede Hilfe

dankbar sein
+1

ja, was ist dein Problem? –

+0

Sie brauchen, aber Sie nicht wissen – gpasch

Antwort

0

Ich m nicht sehr sicher, was ist dein Problem, wahrscheinlich wird dies helfen:

final byte red = 1; // 01 binary 
final byte green = 2; // 10 binary 
final byte blue = 3; // 11 binary 

final byte finalColor = (byte) ((red & 0x3) << 4) | ((green & 0x3) << 2) | (blue & 0x3); 
System.out.println(finalColor);// finalColor is 011011 = 27 decimal 

final int minutes = 0x1234; // first byte is 0x12, second byte is 0x34 
final byte[] bytes = {(byte) (((minutes) >>> 8) & 0xff), (byte) (minutes & 0xff)}; 

System.out.println(bytes[0]); // 0x12 = 18 decimal 
System.out.println(bytes[1]); // 0x34 = 52 decimal 
+0

Danke. Das ist, was ich gesucht habe. – FunkyFrankie

0

Ich bin mir nicht sicher, was das zweite Problem ist. Also habe ich diese beiden Funktionen, die Ihnen helfen:

public static int convertToInt(int a, int b, int c, int d) { 
    a = Math.min(a, 255); 
    b = Math.min(b, 255); 
    c = Math.min(c, 255); 
    d = Math.min(d, 255); 

    return ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | (d & 0xFF); 
} 

public static int[] extractComponents(int data) { 
    int a = (data >> 24) & 0xFF; 
    int b = (data >> 16) & 0xFF; 
    int c = (data >> 8) & 0xFF; 
    int d = data & 0xFF; 

    return new int[] {a, b, c, d}; 
} 

Die convertToInt Funktion vier Zahlen nimmt (das sind weniger als 255) und setzt sie alle in einem int.

Die Funktion extractComponents macht das Gegenteil.

Dies ist ein Beispiel:

int data = 0xC8E0601B; 
int[] dataA = extractComponents(data); 
for(int i = 0 ; i < dataA.length; i++) System.out.printf("%x\n", dataA[i]); 

System.out.printf("%x\n", convertToInt(dataA[0], dataA[1], dataA[2], dataA[3]));