InetAdsress.getAddress(); byte-Array in positive Werte wandeln

HPB

Erfahrenes Mitglied
Hallo,
ich habe folgenden Code:
Code:
import java.io.*;
import java.net.*;

class DNSAnfrage {
   public static void main(String[] args) {
      PrintWriter out = new PrintWriter(System.out, true);
      if (args.length != 1)
         out.println("java DNSAnfrage <hostname>");
      else
         try {
            
            InetAddress ip = InetAddress.getByName(args[0]);
            out.println("Daten fuer '" + args[0] + "':");
            out.println("  toString:       " + ip);
            out.println("  getHostName:    " + ip.getHostName());
            out.println("  getHostAddress: " + ip.getHostAddress());
            byte[] b = ip.getAddress();
            out.print("  getAddress:    ");
            for (int i = 0; i < b.length; ++i)
               out.print(" " + (b[i] & 0xFF));  // keine negativen Werte ausgeben

            out.println("\n\nAlle Adressen fuer '" + args[0] + "':");
            InetAddress[] ips = InetAddress.getAllByName(args[0]);
            for (int i = 0; i < ips.length; ++i)
               out.println("  Die " + (i + 1) + ". IP-Adresse von " + args[0] + " ist: "
                  + ips[i].getHostAddress());

         } catch (UnknownHostException x) {
            // Thrown to indicate that the IP address of a host could not be determined.
            x.printStackTrace();
         }
   }
}

Ich verstehe die Zeile
Code:
for (int i = 0; i < b.length; ++i)out.print(" " + (b[i] & 0xFF));  // keine negativen Werte ausgeben
nicht.
Ich habe gesehen, dass man alternativ folgenden Code verwenden könnte:
Code:
for (int i = 0; i < b.length; ++i)
  int unsignedByte=b[i];
  if (unsignedByte<0) unsignedByte=b[i]+256;

Kann mir jemand erklären, was das Addieren von 256 generell soll und wie die (elegantere) Variante mit dem &0xff funktioniert?

Danke im Voraus.

PETER
 
Eigendlich sollte die elegante Version nicht gehen :)
das doch geht ist Trick 17...

Byte ist in java ein Wertebereich von -128 bis 127
ein Byte sind ja 8 bit und das oberste Bit ist das Vorzeichen

wenn also das JavaByte ein Negativwert hat ist das bit 8 auf eins und eigendlich ein wert
über 128
darum wird bei einem negativen Wert 256 auf addiert um das Vorzeichen rauszuwerfen

Trick 17:
wenn wir im Byte sowas haben
10000000 ist das in Java -128 und in C +128
Java macht bei b[ i ] & 0xFF erst ein Cast von Byte auf Integer
darum wird das Vorzeichen ausgedehnt aus hex 80 Byte wird Integer hex FF80
wenn wir nun ein logisches und drüberbügeln von FF drüberbügeln kommt wider ein hex
80 raus diesmal ohne das minus da es ja Integer ist :)
mit andren Worten hier wird ein wenig getrickst
 
Zurück