27. marts 2002 - 12:02
Der er
11 kommentarer og 2 løsninger
Fra ascii til tekst...
Hej Jeg har en lille opgave jeg gerne vil ha løst.... Jeg har i en browser submittet en form til min accessbean. Den form indeholder et input type text field, som ligger i en streng når alle property's er sat. Jeg har inden jeg submittet formen lavet escape på strengen da den meget vel kan indeholde special tegn. Derfor er alle special tegn lavet om til % + ascii værdi. Strengen hedder myString. Det der er opgaven er at lave en function der tager en streng og oversætter alle disse forekomster af escapede karaktere til klar tekst. Og returnere den læselige streng. Er spørgsmålet forstået ? Godt sæt i gang !!!!!
Annonceindlæg tema
27. marts 2002 - 12:39
#1
int hexVerdi ( char forste, char anden ) { // hjælpefunktion hexværdi eller -1 static final String cifre = "01234567890ABCDEF"; int c1 = cifre.indexOf( toUpperCase(forste) ); int c2 = cifre.indexOf( toUpperCase(anden) ); if ( ( c1 * c2 ) < 0 ) { return -1; } else { return c1*16 +c2; } } //end hexVerdi() String unescape( String myString ) { StringBuffer resultat = new StringBuffer(); int sIdx = 0; int sMax = myString.length(): while ( sIdx < sMax ) { while ( sIdx < sMax && myString.charAt(sIdx) != '%' ) { resultat.append( myString.charAt(sIdx++) ); } if ( myString.charAt(sIdx) == '%' ) { int charKode = -1; if ( sIdx <= sMax-3 ) { int charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) ); } if ( charKode >= 0 ) { resultat.append( (char)charKode ); sIdx += 3; } else { resultat.append( myString.charAt(sIdx++) ); } } } return resultat.toString(); } //end unescape(). mvh JakobA
27. marts 2002 - 12:48
#3
Ups. testen if ( ( c1 * c2 ) < 0 ) { duer ikke. det skal være: if ( c1 < 0 || c2 < 0 ) { sorry
27. marts 2002 - 13:06
#4
Det virker ikke helt : Jeg har rettet de små bugs der var i koden, den ville ikke compile.... Så nu ser den sådan ud : public static int hexVerdi ( char forste, char anden ) { // hjælpefunktion hexværdi eller -1 String cifre = "01234567890ABCDEF"; int c1 = cifre.indexOf( Character.toUpperCase(forste) ); int c2 = cifre.indexOf( Character.toUpperCase(anden) ); if ( c1 < 0 || c2 < 0 ) { return -1; } else { return c1*16 +c2; } } //end hexVerdi() private static String unescape( String myString ) { StringBuffer resultat = new StringBuffer(); int sIdx = 0; int sMax = myString.length(); while ( sIdx < sMax ) { while ( sIdx < sMax && myString.charAt(sIdx) != '%' ) { resultat.append( myString.charAt(sIdx++) ); } if ( myString.charAt(sIdx) == '%' ) { int charKode = -1; if ( sIdx <= sMax-3 ) { charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) ); } if ( charKode >= 0 ) { resultat.append( (char)charKode ); sIdx += 3; } else { resultat.append( myString.charAt(sIdx++) ); } } } return resultat.toString(); } //end unescape(). Jeg har så submittet denne streng : TEST : |;¤§ - %%&/''*^¨~ Når den der escapet ser den sådan her ud : TEST%20%3A%20%7C%3B%A4%A7%20%20-%20%25%25%26/%27%27*%5E%A8%7E Og når den er kørt igennem unescape ser den sådan her ud : TEST ; }<´· - %%&/''*_¸ Så der er noget galt...!
27. marts 2002 - 13:14
#5
Adv. det ligner noget med valg af alfabet (US-ascii versus isoLatin og sådan noget). Det ved jeg for lidt om.
27. marts 2002 - 13:17
#6
Men det er humlen i det hele, da jeg skal kunne håndtere specialtegn.
27. marts 2002 - 14:33
#7
just. men der er nu også moget der ikke passer. : (%3A) bliver til ; (%3B) | (%7C) bliver til } (%7D) ; (%3B) bliver til < (%3C) det ligner jo ligesom en tanke, somom det nok snarere er en logisk fejl i min kode. men jeg kan skutte finde den. mvh JakobA Gaaah. tid til en homer. String cifre = "01234567890ABCDEF"; skal da naturligvis være String cifre = "0123456789ABCDEF"; Jeg havde sat et 0 ind efter 9. man forbløffes!
29. marts 2002 - 21:19
#8
kan jeg få det script der virker??
29. marts 2002 - 21:33
#9
class Encoder { private String cifre = "0123456789ABCDEF"; private String normalchr = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ/:-?#="; private int hexVerdi ( char forste, char anden ) { // hjælpefunktion hexværdi eller -1 int c1 = cifre.indexOf( Character.toUpperCase(forste) ); int c2 = cifre.indexOf( Character.toUpperCase(anden) ); if ( c1 < 0 || c2 < 0 ) { return -1; } else { return c1*16 +c2; } } //end hexVerdi() public String unescape( String myString ) { StringBuffer resultat = new StringBuffer(); int sIdx = 0; int sMax = myString.length(); while ( sIdx < sMax ) { if ( sIdx < sMax && myString.charAt(sIdx) != '%' ) { resultat.append( myString.charAt(sIdx++) ); } else if ( myString.charAt(sIdx) == '%' ) { int charKode = -1; if ( sIdx <= sMax-3 ) { charKode = hexVerdi ( myString.charAt(sIdx+1), myString.charAt(sIdx+2) ); } if ( charKode >= 0 ) { resultat.append( (char)charKode ); sIdx += 3; } else { resultat.append( myString.charAt(sIdx++) ); } } } return resultat.toString(); } //end unescape() public String escape( String sourceStr ) { StringBuffer resultat = new StringBuffer(); int sIdx = 0; int sMax = sourceStr.length(); while ( sIdx < sMax ) { if ( normalchr.indexOf( sourceStr.charAt(sIdx) ) >= 0 ) { resultat.append( sourceStr.charAt(sIdx++) ); } else { if ( (int)sourceStr.charAt(sIdx) == 0 ) { System.out.println( " ? ? ? ? ?" ); } else { resultat.append( '%' ); resultat.append( cifre.charAt( (int)((byte)sourceStr.charAt(sIdx)/16) ) ); resultat.append( cifre.charAt( (int)((byte)sourceStr.charAt(sIdx++)%16) ) ); } } } return resultat.toString(); } //end escape } //endclass Encoder class URLtest { static String syslinie() { int i; StringBuffer res = new StringBuffer(); System.out.print( "> " ); try { while ( (i=System.in.read()) != 13 ) if ( i != 0 && i != 10 ) res.append( (char) i ); } catch (Exception e) { }; return res.toString(); }; //end syslinie public static void main(String[] args) { Encoder e = new Encoder(); String kodet; String outpu; String inpu = syslinie(); while ( inpu.length() > 0 ) { System.out.println( "ind: "+inpu ); kodet = e.escape( inpu ); System.out.println( "kode:"+kodet ); outpu = e.unescape( kodet ); System.out.println( "ud: "+outpu ); inpu = syslinie(); } }; //end main } //endclass URLtest // TEST : |;¤§ - %%&/''*^¨~ mvh JakobA
29. marts 2002 - 21:36
#10
online-help.dk >> mit valg af bogstaver til strengen normalchr er mere gæt end viden. check selv med http-specs.
30. marts 2002 - 12:20
#11
OK, ok ok ok ok ok ok ok. Jeg har ikke afprøvet dit script jakoba... Jeg må med sorg fortælle at jeg netop har blotlagt vores manglende viden om java.net API'et... Der findes en java.net.Decoder, der gør præcis det som jeg skal bruge. Så den tror jeg bare at jeg bruger.... ANYWAY, så skal du da ha dine point for at finde en løsning.....!svar
30. marts 2002 - 15:10
#12
Jamen det er da rart at høre du også kan kan lave fejl ( omend knapt så fjogede :-)) Skal vi dele i porten? 50/50 mvh JakobA
OK, sorry the Looooooooongggg turnaround time...:)
Kurser inden for grundlæggende programmering