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
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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