tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
1
ZUGRIFFE
685
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HPB HPB ist offline Mitglied Gold
    Registriert seit
    Sep 2003
    Beiträge
    187
    Hallo,
    ich habe folgenden Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    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
    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:

    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
     

  2. #2
    Registriert seit
    Jul 2002
    Ort
    Frankfurt (Hessen)
    Beiträge
    2.135
    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
     

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 22.02.10, 12:05
  2. Zip und unzip von byte-Array
    Von Szdnez im Forum Java
    Antworten: 2
    Letzter Beitrag: 08.09.09, 09:24
  3. byte [] - Array reseten
    Von bladich im Forum Java
    Antworten: 3
    Letzter Beitrag: 24.11.06, 15:58
  4. Wandeln von BYTE nach BOOL
    Von salma im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 21.01.05, 15:51
  5. Werte übergeben und String in Integer wandeln
    Von aneril im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 12.06.03, 14:51