2016-04-09 7 views
1

Ich habe den folgenden Code, der eine binäre Zeichenfolge mit Nullen-Pad links versucht:Padding für Hex in Binär-Konvertierung, so dass jeder Hexadezimalzeichens erzeugt 4 Bits

int i = Integer.parseInt(input, 16); 
String binaryString = Integer.toBinaryString(i); 
String pad = String.format("%4s", Integer.toBinaryString(i)).replace(' ', '0'); 

Wenn der Eingang "1" ist, produziert sie richtig "0001" , aber wenn ich zusätzliche Hexadezimalziffern hinzufüge, fügt es keine Auffüllung mehr hinzu. Zum Beispiel erzeugt "2F""101111", aber ich möchte, dass es 8 Bits wie 001011111 ist.

Wie kann ich das beheben?

+0

Aber '2F' im Binärformat hat 6 Bits (' 101111'). Was meinst du damit, du willst nur 4 Bits? Du kannst es nicht mit nur 4 Bits schreiben - es gibt hier keine Auffüllung. Bitte klären Sie, was das eigentliche Problem ist. – Bohemian

+0

Ich meine, ich möchte jeden Hex-Wert 4 Bit lang haben, also wenn 2 ist 0010, möchte ich diese anderen 0 in der Front – F22lightning

+0

Vielen Dank für die Festsetzung meiner Frage Bohemian. – F22lightning

Antwort

1

Ihr Problem ist, dass Sie eine Mindest Breite von 4 angegeben haben, aber 2F hat Bits, also 6 Zeichen erzeugt werden.

Sie können entweder:

  • Format jeder einzelne Hexadezimalzeichens einzeln und verketten die Ergebnisse
  • Sprechen Sie die Formatbreite dynamisch - 4-mal die Anzahl der hexadezimalen Ziffern
  • Verwenden Sie einen String-basierten Ansatz
  • Etwas anderes

Die einfachste ist ein String-basierten Ansatz, wenn Sie Ihre requireme umformulieren um "immer ein Vielfaches von 4 Bits zu erzeugen".

Hier ist, wie Sie das tun:

String pad = String.format("%32s", Integer.toBinaryString(i)).replace(' ', '0') 
    .replaceAll("^(0000)+", ""); 

Der Unterschied ist, ich die Ausgabe 32 Zeichen geändert werden (die maximalen Bits ein int können) und führende Nullen 4 zu einer Zeit, abgeschnitten durch Zugabe von .replaceAll("^(0000)+", "") zu dein Code.

Diese Regex entspricht "1 oder mehr Vorkommen von 0000 am Anfang des Strings" und der Ersatzbegriff ist ein Leerzeichen, so dass alles, was übereinstimmt, "gelöscht" wird.

+0

Ich sehe was du getan hast, das war eine gute Annäherung, Danke. – F22lightning

+0

Ist es nicht einfacher, 'String.format ("% 032s ", ...) zu verwenden. ReplaceAll (...)?' Versteht String.format nicht "% 0"? – bipll

+0

@bipll Ich dachte darüber nach, aber als ich das Dokument überprüfte, fand ich das "0" Padding-Flag nur für numerische Typen :( – Bohemian