Konvertierung String-->hex-->long

andreas2505

Bekanntes Mitglied
Hallo,

ich möchte einen String in einen hexadezimalen String konvertieren (das klappt auch) und anschließend in einen Long umwandeln.
Das klappt allerdings nicht.

Java:
public static String stringToHex(String base)
    {
     StringBuffer buffer = new StringBuffer();
     int intValue;
     for(int x = 0; x < base.length(); x++)
         {
         int cursor = 0;
         intValue = base.charAt(x);
         String binaryChar = new String(Integer.toBinaryString(base.charAt(x)));
         for(int i = 0; i < binaryChar.length(); i++)
             {
             if(binaryChar.charAt(i) == '1')
                 {
                 cursor += 1;
             }
         }
         if((cursor % 2) > 0)
             {
             intValue += 128;
         }
         buffer.append(Integer.toHexString(intValue) + " ");
     }
     return buffer.toString();
    }


public static long HextoLong(String s) {
        long num = 0;
        
        try{
            BufferedReader bf = new BufferedReader(new StringReader(s.substring(0,16)));
            String hex = bf.readLine();
            num = Long.parseLong(hex,16);
        }
        catch (IOException e) {
                e.printStackTrace();
        }
            
        return num;

    }

public static void main(String[] args)
    {
     String s = "The cat in the hat";
     System.out.println(s);
     System.out.println(stringToHex(s));
     long m = HextoLong(stringToHex(s));
     System.out.println(m);
    }

Also die Methode HextoLong funktioniert nur für Zahlen, aber nicht für Hexadezimale Strings.

Wo liegt der Fehler?
 
Java:
            String hex = bf.readLine();
            System.out.println("hex: "+hex);
            hex = hex.replaceAll(" ","");
            System.out.println("hex: "+hex);
            num = Long.parseLong(hex, 16);
            System.out.println("num: "+num);

Methoden klein schreiben!
 
nur das Leerzeichen weg machen hilft nix. Da kommt trotzdem wieder eine numberformatexception.

Wenn nur ein Buchstabe drin steht funktionierts nicht mehr...
 
du postest vorbildlich ein Komplettprogramm mit main-Methode, welches direkt zum Fehler führt,
ich korrigiere den Fehler und nun meldest du ein neues Problem mit diffusen, für mich jedenfalls nicht nachvollziehbaren Umständen und ohne Beispiel-Code oder vergleichbares,
liegt hier nicht ein systematischer Forum-Fehler vor?

oder meinst du dass das erste Programm noch Fehler liefert?
Java:
public class Test
{

    public static String stringToHex(String base)
    {
        StringBuffer buffer = new StringBuffer();
        int intValue;
        for (int x = 0; x < base.length(); x++)
        {
            int cursor = 0;
            intValue = base.charAt(x);
            String binaryChar = new String(Integer.toBinaryString(base.charAt(x)));
            for (int i = 0; i < binaryChar.length(); i++)
            {
                if (binaryChar.charAt(i) == '1')
                {
                    cursor += 1;
                }
            }
            if ((cursor % 2) > 0)
            {
                intValue += 128;
            }
            buffer.append(Integer.toHexString(intValue) + " ");
        }
        return buffer.toString();
    }


    public static long HextoLong(String s)
    {
        long num = 0;

        try
        {
            BufferedReader bf = new BufferedReader(new StringReader(s.substring(0, 16)));
            String hex = bf.readLine();
            System.out.println("hex: "+hex);
            hex = hex.replaceAll(" ","");
            System.out.println("hex: "+hex);
            num = Long.parseLong(hex, 16);
            System.out.println("num: "+num);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return num;

    }

    public static void main(String[] args)
    {
        String s = "The cat in the hat";
        System.out.println(s);
        System.out.println(stringToHex(s));
        long m = HextoLong(stringToHex(s));
        System.out.println(m);
    }
}
bei mir fehlerlos
Code:
The cat in the hat
d4 e8 65 a0 63 e1 74 a0 69 ee a0 74 e8 65 a0 e8 e1 74 
hex: d4 e8 65 a0 63 e
hex: d4e865a063e
num: 14630912656958
14630912656958
wobei man sich natürlich schon fragen kann, ob nicht z.B erst die Leerzeichen entfernt und dann 16 Zeichen abgeschnitten werden sollten
 
Zuletzt bearbeitet von einem Moderator:
ich führe einfach nur die main methode aus und dabei kommt jedesmal die Fehlermeldung:

java.lang.NumberFormatException: For input string: "d4e86563e17469ee"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:422)
at Threefish.hextoLong(Threefish.java:49)
at Threefish.main(Threefish.java:92)

Der Fehler war damit nicht korrigiert! Weil das anscheinend nicht der Fehler war...

edit:

ich meinte das erste Programm natürlich. Komisch bei mir kommt diese Fehlermeldung

ich prüfe nochmal
 
Der Fehler war damit nicht korrigiert! Weil das anscheinend nicht der Fehler war...
frech frech, meine Verbesserung an anderer Stelle einzubauen und dann weitere Fehler in deinem Programm so zu bewerten als wäre meine Hilfe nicht hilfreich 😉

neues Spiel, diesmal nur ein Hinweis:
Java:
s = s.replaceAll(" ", "");
BufferedReader bf = new BufferedReader(new StringReader(s.substring(0, 15))); // 15 ist weniger als 16
String hex = bf.readLine(); // wieso nicht eigentlich direkt s.substring()?
System.out.println("hex: " + hex);
num = Long.parseLong(hex, 16);
System.out.println("num: " + num);
System.out.println("max: " + Long.MAX_VALUE);
 
Zuletzt bearbeitet von einem Moderator:
ok das klappt soweit,

das Problem ist, dass es hier wieder um ein Kryptosystem geht und damit, wenn ich die Leerzeichen vorher entferne, die zu verschlüsselnde Nachricht verfälsche...
 
dann bietet sich eine Umwandlung in Long also nicht an?
oder wenn du am Ende selber wieder einen String aus dem Long machst, dann denke dir irgendwas passendes aus,
z.B. die Regel dass nach je zwei Buchstaben in String wieder ein Leerzeichen rein muss
 

Neue Themen


Zurück
Oben