2016-04-08 11 views
1

Ich habe einen Code für MD5-Hash-Generierung in Java. Er erzeugt die Hash in Byte-Array „Bytes“ und wandelt dann auf ganzzahlige und dann auf String wie folgt:Byte zu Integer und dann zu String-Konvertierung in Java

byte[] bytes=md.digest(textToHash.getBytes()); 

StringBuilder sb=new StringBuilder(); 
for(int i=0;i<bytes.length;i++) 
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); 

I verstanden, dass bytes[i] & 0xff Byte ganze Zahl von 32 Bit-Länge Kopieren wandelt das Byte zu dem niedrigstwertigen Byte des die ganze Zahl:

What does value & 0xff do in Java?

aber ich konnte nicht verstehen, was + 0x100, 16 tut in den Klammern in Zeile 4 des oben genannten Code. Deine Hilfe wird geschätzt.

Antwort

1

Aufbrechen Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1):

  • 0x100 Hinzufügen (was 256 dezimal) setzt das 9. Bit zu 1, die die Binärzahl Darstellung des Ergebnisses gewährleistet hat genau 9-Bit. Sie könnten äquivalent & 0x100 tun.
  • Nach dem Setzen von Bit 8 wird das Ergebnis von toString() 9 Zeichen lang sein (aus Nullen und Einsen).
  • substring(1) ignoriert effektiv Bit 8 und gibt die unteren 8 Bits

So what?

Dieser Code setzt führende Nullen auf Werte, so dass alle Werte genau 8 Binärzeichen sind. Es gibt keine Möglichkeit, Integer.toString() alleine machen zu lassen.

+0

Danke, aber was ist das, 16? –

+0

'16' ist die * radix * - dh Basis 16, die hexadezimal ist. Der Code gibt grundsätzlich "1" als "01" statt "1" aus. – Bohemian

+0

danke. Ich fand auch einen einfacheren Weg in den Foren: sb.append (String.format ("% 02X", bytes [i])); –