Verständnisfrage

wSam

Erfahrenes Mitglied
Hallo zusammen

Ich habe ein paar Fragen zu folgenden Codestücken:

Java:
for (int i = 0; i < hash.length; i++) {
  if ((hash[i] & 0xff) < 0x10) {
    buf.append(0);
  }
  buf.append(Long.toString(hash[i] & 0xff, 16));
}

Nun ist mir dijenige Stelle nicht ganz klar:
Java:
if ((hash[i] & 0xff) < 0x10) {
Wie funktioniert das & mit Hexadezimalen Werten?

Hier ist es ähnlich:
Java:
(hash[i] & 0xff, 16)

Und noch eine weitere Frage: Was bekomme ich hier von md.digest() zurück (einen dezimalen String)?

Java:
md = MessageDigest.getInstance("MD5");
md.update("abc".getBytes());
byte[] result = md.digest();

Vielen Dank im Voraus und Gruss
 
Zuletzt bearbeitet:
Code:
if ((hash[i] & 0xff) < 0x10)

Die Bedingung kann ich dir erklären, da wird mit "&" ein Binärer-Vergleich (Und) durchgeführt. Keine Ahnung welchen Wert hash[i] hat, da ich den Zusammenhang nicht kenne, auf alle Fälle wird es auch eine Zahl sein.

Ein Beispiel:

0xFF steht für 255 im Dezimalen Zahlen System.
Für hash[i] nehmen wir einfach 7B HEX = 123 DEZ

Dann nehmen wir uns den ersten Klammerausdruck vor

(0x7B & 0xFF)

Bedeutet die Zahlen 123 und 255 werden binär miteinander addiert,
deshalb die Zahlen in Binärdarstellung:
Code:
0111 1011 = 123
1111 1111 = 255
------------------------
0111 1011 = 123
Es werden also alle Stellen mit UND-Verglichen und & liefert immer nur 1 wenn beide Stellen 1 sind.

Also links nach rechts:
Code:
0 + 1 = 0
1 + 1 = 1
1 + 1 = 1
1 + 1 = 1
1 + 1 = 1
0 + 1 = 0
1 + 1 = 1
1 + 1 = 1
Das Ergebnis ist also 0111 1011 somit liefert der Klammer-Ausdruck (0x7B & 0xFF) 123 zurück. Dann kommt der zweite Ausdruck
Code:
123 DEZ < 0x10 HEX

10 im Hexadezimalen System steht für 16 im Dezimalen-System. Draus folgt:

Code:
WENN 123 < (KLEINER ALS) 16 DANN buf.append(0);
 
Ah, vielen Dank für deine ausführliche Hilfe.

Wie geht das dann da mit dem Komma bei dieser Bedingung?

Code:
(hash[i] & 0xff, 16)

Danke nochmals.
 
Also das Konstrukt ist mir schon aufgefallen und es ist mir leider unbekannt. Andererseits, ich bekomme selbst einen Kompilierungsfehler. Woher hast du denn den Code bzw. kannst du die Zielen posten, in welchen das enthalten ist?

Und übrigens zu der Frage von digest(). Digest liefert ein Byte-Array zurück. Der Byte-Datentyp repräsentiert ein Byte, also 0-255. Üblicherweise wird der MD5-Hash als HEX-String dargestellt, hierzu kannst du folgendes machen:

Java:
md = MessageDigest.getInstance("MD5");
md.update("abc".getBytes());
byte[] result = md.digest();

String md5Hash = "";

for(int i = 0; i < result.length; i++) {

  md5Hash += Integer.toHexString(result[i] & 0xFF);
}

System.out.println(md5Hash);

Und falls du dich fragst, was (result[i] & 0xFF) hier zu bedeuten hat...

toHexString erwartet einen INT-Wert ... indem ich meinen Byte Wert mit 255 (FF) vergleiche, wandle ich ihn praktisch in einen INT-Wert um ohne den Wert selbst zu verändern.

255 ist binär nämlich 1111 1111 Folglich kommt es nur auf result[i] an, ob jetzt ein 1 od. 0 zurückgeliefert wird. Das siehst du gut am obigen Beispiel, wo 123 & 255 wieder 123 ergibt.

There are 10 types of people who understand binary. Those who understand binary and those who don't.
 
Hallo!

Also das Konstrukt ist mir schon aufgefallen und es ist mir leider unbekannt. Andererseits, ich bekomme selbst einen Kompilierungsfehler. Woher hast du denn den Code bzw. kannst du die Zielen posten, in welchen das enthalten ist?

Die 16 ist der zweite Parameter der toString(....) Methode von Long und gibt die Basis an zu der die übergebene Zahl transformiert werden soll.

Java:
System.out.println(Long.toString(255, 16)); // -> FF

Gruß Tom
 
Hm, wenn man das ganze Konstrukt sieht, geht mir auch ein Licht auf *lol*

Parameter... wie peinlich :-(

:offtopic:
 
Zurück