Avatar billede nidyahou Praktikant
17. november 2009 - 14:22 Der er 17 kommentarer og
1 løsning

forklaring af kode

hvad betyder det her:

mydecclass = (Base64)Class.forName(handlerClass).newInstance();

Det er Base64 delen som jeg ikke forstår. Hvad vil det sige når man sætter (xxx) foran en Class.forname(...
Avatar billede tjp Mester
17. november 2009 - 14:32 #1
At man 'caster' dvs. fastsætter typen på det der kommer efter til den type, der står i parantes, her altså til Base64.
Avatar billede arne_v Ekspert
17. november 2009 - 14:52 #2
Object mydecclass = Class.forName(handlerClass).newInstance();

saa kan man kun bruge de metoder der er i Object klassen

Base64 mydecclass = (Base64)Class.forName(handlerClass).newInstance();

saa kan man bruge de metoder som er i Base64 klassen selvom de ikke er i Object
Avatar billede nidyahou Praktikant
17. november 2009 - 15:35 #3
super - tak

post gerne svar :)
Avatar billede nidyahou Praktikant
17. november 2009 - 16:11 #4
hvis der er nogen af jer der ved hvordan jeg caster en klasse jeg loader ind i jython på den måde, så sig endelig til
Avatar billede arne_v Ekspert
17. november 2009 - 16:29 #5
Det er ikke noedvendigt i jython.

I Python kalder du bare en metode paa et objekt og ved koersel checkes der om metoden eksisterer. Ja => den kaldes. Nej => du faar en fejl.

I Java checkes der paa compile time om metoden eksisterer og derfor kan det vaere noedvendigt at caste til en anden type for at faa lov til at compile.
Avatar billede nidyahou Praktikant
17. november 2009 - 16:45 #6
mit problem er at jeg har en base64 encoding/decoding funktion i java, men når jeg en-/decoder ved at kalde funktionen fra jython får jeg alle mulige tegn tilbage. Jeg kan forstå hvis dette var tilfældet nogle gange med decoding, men kan det virkelig også være tilfældet med encoding? i det tilfælde forstår jeg ikke base64 alfabetet ;o) Det var derfor jeg tænkte at jeg måske skulle kaste, selvom python selv finder.
Avatar billede arne_v Ekspert
17. november 2009 - 17:15 #7
Foelgende virker hos mig (med passende jar filer i CLASSPATH):

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;

public class B64 {
    public static String b64encode(byte[] b) throws MessagingException, IOException  {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream b64os = MimeUtility.encode(baos, "base64");
        b64os.write(b);
        b64os.close();
        return new String(baos.toByteArray());
    }
    public static byte[] b64decode(String s) throws MessagingException, IOException  {
        ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
        InputStream b64is = MimeUtility.decode(bais, "Base64");
        byte[] tmp = new byte[s.length()];
        int n = b64is.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return res;
    }
}

import B64
b1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print b1
s = B64.b64encode(b1)
print s
b2 = B64.b64decode(s)
print b2
Avatar billede nidyahou Praktikant
17. november 2009 - 19:51 #8
mit problem udspringer af at hvis jeg har min java metode:

    public String base64Chars()
    {
        String s = "";
        int ai[] = new int[64];
        ai[0] = 17;
        ai[1] = 30;
        ai[2] = 51;
        ai[3] = 33;
        ai[4] = 50;
        ai[5] = 35;
        ai[6] = 55;
        ai[7] = 28;
        ai[8] = 19;
        ai[9] = 16;
        ai[10] = 1;
        ai[11] = 45;
        ai[12] = 41;
        ai[13] = 62;
        ai[14] = 24;
        ai[15] = 39;
        ai[16] = 6;
        ai[17] = 22;
        ai[18] = 42;
        ai[19] = 7;
        ai[20] = 11;
        ai[21] = 4;
        ai[22] = 29;
        ai[23] = 32;
        ai[24] = 34;
        ai[25] = 31;
        ai[26] = 5;
        ai[27] = 58;
        ai[28] = 44;
        ai[29] = 61;
        ai[30] = 56;
        ai[31] = 47;
        ai[32] = 10;
        ai[33] = 37;
        ai[34] = 46;
        ai[35] = 49;
        ai[36] = 13;
        ai[37] = 43;
        ai[38] = 57;
        ai[39] = 27;
        ai[40] = 26;
        ai[41] = 59;
        ai[42] = 38;
        ai[43] = 25;
        ai[44] = 15;
        ai[45] = 36;
        ai[46] = 60;
        ai[47] = 9;
        ai[48] = 3;
        ai[49] = 12;
        ai[50] = 23;
        ai[51] = 20;
        ai[52] = 52;
        ai[53] = 14;
        ai[54] = 8;
        ai[55] = 54;
        ai[56] = 48;
        ai[57] = 0;
        ai[58] = 2;
        ai[59] = 63;
        ai[60] = 53;
        ai[61] = 40;
        ai[62] = 18;
        ai[63] = 21;
        for(int i = 0; i <= 63; i++)
            s = s.append(new StringBuffer()).append((char)chars[ai[i]]).toString();

        return s;
    }

og jeg kalder i jython
class.base64Chars()

så får jeg tilbage:
%2G5F7K0'$A=R,;*>1463N@QLC9BE!?M/.O:-#8P +(H"JDSI<&)

som jo ganske vist er af længden 64, men char'sne er da helt off?
Avatar billede arne_v Ekspert
17. november 2009 - 20:09 #9
Hvad indeholde chars array'et i Java koden?

Jeg har lidt mistanke om at fejlen ligger i Java koden.
Avatar billede nidyahou Praktikant
17. november 2009 - 20:13 #10
hm... når jeg ser på arrayet går det op for mig at den simpelthen bare tager chars efter ascii tabel og at [0] = #
Avatar billede nidyahou Praktikant
17. november 2009 - 20:20 #11
har valgt at sende arne_v koden i en intern besked, da jeg helst ikke vil have at malicious typer spotter koden og får alt for nemt ved at breake den. Jeg beklager til dem der kigger i tråden for at finde hjælp til et lignende problem, jeg skal prøve at redegøre for udviklingen senere i tråden
Avatar billede arne_v Ekspert
17. november 2009 - 20:21 #12
Koden ser generelt meget suspekt ud.

String s = "";
...
for(int i = 0; i <= 63; i++)
    s = s.append(new StringBuffer()).append((char)chars[ai[i]]).toString();
return s;

kunne laves som:

String s = "";
...
for(int i = 0; i < 64; i++)
    s = s + (char)chars[ai[i]];
return s;

eller:

StringBuilder s = new StringBuilder();
...
for(int i = 0; i < 643; i++)
    s.Append((char)chars[ai[i]]);
return s.toString();
Avatar billede arne_v Ekspert
17. november 2009 - 20:22 #13
64 ikke 643
Avatar billede nidyahou Praktikant
17. november 2009 - 20:28 #14
men det mystiske er jo at det virker i java, men ikke i jython
Avatar billede nidyahou Praktikant
17. november 2009 - 21:50 #15
jeg tror problemet skyldes at jeg ikke kan caste til base64

den fortolker char() som streng og ikke som base64 karakterer
Avatar billede nidyahou Praktikant
17. november 2009 - 21:50 #16
og "den" er en term der er teknisk gyldig ;)
Avatar billede nidyahou Praktikant
31. december 2009 - 01:41 #17
drop et svar =)
Avatar billede arne_v Ekspert
31. december 2009 - 01:46 #18
ok
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