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?
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
Til er nemt: char c = 'a'; System.out.println(Integer.toHexString(c));
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.
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; } } }
hehe ja der er nogle som ka' ;-)
Det gik vist lige lovligt stærkt. 'Z' og 'z' skal nok erstattes med 'F' og 'f'! :-)
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)
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; } }
Ja. Det har kun betydning hvis der kommer ikke legale hex værdier ind. Men man kunne få nogle sjove resultater.
Jeg så iøvrigt at du stillede samem spørgsmål i C#. Udvikler du samme komponent parallelt i 2 sprog ?
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! :-)
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; } } }
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...
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?
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)
07. juli 2003 - 16:45
#15
Så du skal have enten en løkke uden om fromHex eller en løkke inden i fromHex.
07. juli 2003 - 16:47
#16
(hvis løkken er udenom skal den returnere et array af char)
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?
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; } } }
07. juli 2003 - 17:41
#19
Output: 61 61 a a 6a6b6c6d6e6f jklmno
07. juli 2003 - 17:41
#20
Jeg havde glemt at ligge 10 til i c - 'A' og c - 'a' ! :-(
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)
07. juli 2003 - 20:21
#22
Hehe anyway - nu virker det som det skal. Endnu engang mange tak for hjælpen Arne
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); } }
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.
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
Kurser inden for grundlæggende programmering