Avatar billede repsak Nybegynder
07. juli 2003 - 13:47 Der er 24 kommentarer og
1 løsning

Convertering fra char til hex

Hvordan konverterer jeg en char 'a' til hexværdien?
Hvordan konverterer jeg en hexværdi til en char?
Avatar billede arne_v Ekspert
07. juli 2003 - 13:57 #1
Til er nemt:

        char c = 'a';
        System.out.println(Integer.toHexString(c));
Avatar billede arne_v Ekspert
07. juli 2003 - 14:04 #2
2 minutters kodning gav:

    public static char fromhex(String hex) {
        return (char)(hexval(hex.charAt(0)) * 16 + hexval(hex.charAt(1)));
    }
    private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'Z') {
            return c - 'A';
        } else if(c >= 'z' && c <= 'z') {
            return c - 'a';
        } else {
            return 0;
        }
    }

for at gå den anden vej.
Avatar billede arne_v Ekspert
07. juli 2003 - 14:05 #3
Testet med:

public class Hex {
    public static void main(String[] args) {
        char c = 'a';
        System.out.println(Integer.toHexString(c));
        String hex = "61";
        System.out.println(fromhex(hex));
       
    }
    public static char fromhex(String hex) {
        return (char)(hexval(hex.charAt(0)) * 16 + hexval(hex.charAt(1)));
    }
    private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'Z') {
            return c - 'A';
        } else if(c >= 'z' && c <= 'z') {
            return c - 'a';
        } else {
            return 0;
        }
    }
}
Avatar billede repsak Nybegynder
07. juli 2003 - 14:19 #4
hehe ja der er nogle som ka' ;-)
Avatar billede arne_v Ekspert
07. juli 2003 - 14:32 #5
Det gik vist lige lovligt stærkt.

'Z' og 'z' skal nok erstattes med 'F' og 'f'!

:-)
Avatar billede repsak Nybegynder
07. juli 2003 - 14:52 #6
hehe oki... så grundigt har jeg dog ikke testet det endnu - retter det lige :-)
(så kan jeg også bedre følge din tankegang - for det der Z gav ikke mening)
Avatar billede repsak Nybegynder
07. juli 2003 - 14:59 #7
hmm nu blir jeg lige forvirret. Er det sådan her du mener:

private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'F') {
            return c - 'A';
        } else if(c >= 'a' && c <= 'f') {
            return c - 'a';
        } else {
            return 0;
        }
    }
Avatar billede arne_v Ekspert
07. juli 2003 - 15:23 #8
Ja.

Det har kun betydning hvis der kommer ikke legale hex værdier ind.

Men man kunne få nogle sjove resultater.
Avatar billede arne_v Ekspert
07. juli 2003 - 15:23 #9
Jeg så iøvrigt at du stillede samem spørgsmål i C#.

Udvikler du samme komponent parallelt i 2 sprog ?
Avatar billede repsak Nybegynder
07. juli 2003 - 15:28 #10
Ja... Jeg prøvede at kopiere din metode til C# (no problems), men jeg kunne ikke oversætte Java.lang.Integer.toUnsignedString(...) (som java bruger til at konvertere) til C#, men det var ikke så let :-(
Derfor! :-)
Avatar billede arne_v Ekspert
07. juli 2003 - 15:28 #11
Her er en version med F og med en manuel toHex:

public class Hex {
    public static void main(String[] args) {
        char c = 'a';
        System.out.println(Integer.toHexString(c));
        System.out.println(toHex(c));
        String hex = "61";
        System.out.println(fromhex(hex));
       
    }
    private static char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                                        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    public static String toHex(char c) {
        StringBuffer sb = new StringBuffer("");
        sb.append(hexdigit[(c >> 4) & 0x0F]);
        sb.append(hexdigit[c & 0x0F]);
        return sb.toString();
    }
    public static char fromhex(String hex) {
        return (char)(hexval(hex.charAt(0)) * 16 + hexval(hex.charAt(1)));
    }
    private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'F') {
            return c - 'A';
        } else if(c >= 'z' && c <= 'f') {
            return c - 'a';
        } else {
            return 0;
        }
    }
}
Avatar billede repsak Nybegynder
07. juli 2003 - 15:42 #12
Haha hvor sejt... din toHex metode kan jeg godt konvertere til C# :-D
Tusinde tak!
Hvis du kopierer (eller refererer til) din toHex metode i http://www.eksperten.dk/spm/373592 så kan du også lige få de par points også. (for faktisk er jeg ligeglad med om metoden er fra .NET-frameworket elle ej...
Avatar billede repsak Nybegynder
07. juli 2003 - 16:31 #13
*er igang med den intensive test hvor jeg prøver at konvertere begge veje*
metoden FromHex er ikke så glad for følgende: (alfabetisk j-o)
6a6b6c6d6e6f
kan du lure hvorfor?
Avatar billede arne_v Ekspert
07. juli 2003 - 16:42 #14
Ovenstående from hex er kun til:
  2 hex tegn -> 1 char fra 0 til 255 (eller fra -128 til 127)
Avatar billede arne_v Ekspert
07. juli 2003 - 16:45 #15
Så du skal have enten en løkke uden om fromHex eller en løkke inden i fromHex.
Avatar billede arne_v Ekspert
07. juli 2003 - 16:47 #16
(hvis løkken er udenom skal den returnere et array af char)
Avatar billede repsak Nybegynder
07. juli 2003 - 16:50 #17
hmm jeg er ikke helt med... ifølge min oversigt opfylder f.eks. j (hex: 6a - dec: 106) begge dine krav (07/07-2003 16:42:49)

hvad skal den løkke så gøre?
Avatar billede arne_v Ekspert
07. juli 2003 - 17:40 #18
Det gik alt for hurtigt.

Følgende virker:

public class Hex {
    public static void main(String[] args) {
        char c = 'a';
        System.out.println(Integer.toHexString(c));
        System.out.println(toHex(c));
        String hex = "61";
        System.out.println((char)Integer.parseInt(hex, 16));
        System.out.println(fromHex(hex));
        char[] c2 = { 'j', 'k', 'l', 'm', 'n', 'o' };
        System.out.println(toHex(c2));
        String hex2 = "6a6b6c6d6e6f";
        System.out.println(manyFromHex(hex2));
    }
    private static char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                                      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    public static String toHex(char c) {
        StringBuffer sb = new StringBuffer("");
        sb.append(hexdigit[(c >> 4) & 0x0F]);
        sb.append(hexdigit[c & 0x0F]);
        return sb.toString();
    }
    public static String toHex(char[] c) {
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < c.length; i++) {
            sb.append(hexdigit[(c[i] >> 4) & 0x0F]);
            sb.append(hexdigit[c[i] & 0x0F]);
        }
        return sb.toString();
    }
    public static char fromHex(String hex) {
        return (char)(hexval(hex.charAt(0)) * 16 + hexval(hex.charAt(1)));
    }
    public static char[] manyFromHex(String hex) {
        int n = hex.length() / 2;
        char[] res = new char[n];
        for(int i = 0; i < n; i++) {
            res[i] = (char)(hexval(hex.charAt(2 * i)) * 16 + hexval(hex.charAt(2 * i + 1)));
        }
        return res;
    }
    private static int hexval(char c) {
        if(c >= '0' && c <= '9') {
            return c - '0';
        } else if(c >= 'A' && c <= 'F') {
            return c - 'A' + 10;
        } else if(c >= 'a' && c <= 'f') {
            return c - 'a' + 10;
        } else {
            return 0;
        }
    }
}
Avatar billede arne_v Ekspert
07. juli 2003 - 17:41 #19
Output:

61
61
a
a
6a6b6c6d6e6f
jklmno
Avatar billede arne_v Ekspert
07. juli 2003 - 17:41 #20
Jeg havde glemt at ligge 10 til i c - 'A' og c - 'a' !

:-(
Avatar billede arne_v Ekspert
07. juli 2003 - 17:42 #21
Brugen af løkker burde fremgå af eksemplet.

Og jeg fandt også lige Java's indbyggede hex-to-int:
  (char)Integer.parseInt(hex, 16)
Avatar billede repsak Nybegynder
07. juli 2003 - 20:21 #22
Hehe anyway - nu virker det som det skal. Endnu engang mange tak for hjælpen Arne
Avatar billede arne_v Ekspert
07. juli 2003 - 23:39 #23
Jeg kunne ikke lige dy mig for at prøve i C# og kom frem til følgende:

using System;
using System.Globalization;

class MainClass
{
    public static void Main(string[] args)
    {
        char c1 = 'a';
        String hex = String.Format("{0,2:X}", (int)c1);
        Console.WriteLine(hex);
        char c2 = (char)int.Parse(hex, NumberStyles.HexNumber);
        Console.WriteLine(c2);
    }
}
Avatar billede arne_v Ekspert
07. juli 2003 - 23:40 #24
Det er så igen kun 1 char <-> 2 hex digits, men du kan sikkert sætte
en løkke omkring for at håndtere hele strenge.
Avatar billede repsak Nybegynder
08. juli 2003 - 11:46 #25
Hehe du kan bare ikke lade være ;-)
Ja med ovenstående eksempel ved hånden så skulle det nok kunne lade sig gøre
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester