Avatar billede andy2003 Nybegynder
25. juli 2003 - 09:47 Der er 5 kommentarer

Race Encoding i Java

Er der nogen der ved hvordan man laver Race encoding/decodning af URL'er i JAVA ?
Avatar billede simonvalter Praktikant
25. juli 2003 - 17:37 #1
jeg ved ikke helt hvordan man laver det .. men har du kigget på
http://www.i-d-n.net/draft/draft-ietf-idn-race-03.txt (den ser ud til at være den sidste update .. )
Avatar billede andy2003 Nybegynder
25. juli 2003 - 17:47 #2
Jo tak... :-) Det var netop den jeg ville undgå at kaste mig ud i og havde håbet at der var nogen der kendte til en package eller lignende hvor det var gjort. Men ellers tak.
Avatar billede arne_v Ekspert
25. juli 2003 - 23:55 #3
Her er noget kode.

Det er kun encode ikke decode.

Og der er fejl i en af casene (alle fra row 0x00 eller en anden row).

Sig til hvis det er værd at arbejde lidt videre på dette:

public class RACE {
    private static byte[] compress(char[] c) {
        boolean allhighsame = true;
        int ff = 0;
        for(int i = 1; i < c.length; i++) {
            if((c[i] >> 8) != (c[0] >> 8)) {
                allhighsame = false;
            }
            if(((c[i] & 0xFF00) == 0xFF00) || ((c[i] & 0xFF) == 0xFF)) {
                ff++;
            }
        }
        if(allhighsame) {
            byte[] res = new byte[c.length + 1 + ff];
            res[0] = (byte)(c[0] >> 8);
            int ix = 1;
            for(int i = 0; i < c.length; i++) {
                res[ix] = (byte)(c[i] & 0xFF);
                if(res[ix] == (byte)0xFF) {
                    res[ix + 1] = (byte)0x99;
                    ix++;
                }
                ix++;
            }
            return res;
        } else {
            byte[] res = new byte[c.length * 2 + 1];
            res[0] = (byte)0xD8;
            for(int i = 0; i < c.length; i++) {
                res[2 * i + 1] = (byte)(c[i] >> 8);
                res[2 * i + 2] = (byte)(c[i] & 0xFF);
            }
            return res;
        }
    }
    private static final char[] b32 =
                { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
                  'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
                  'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
                  'y', 'z', '2', '3', '4', '5', '6', '7' };
    private static char[] base32encode(byte[] b) {
        int len = (b.length * 8 - 1) / 5 + 1;
        char[] res = new char[len];
        short acc = 0;
        int bits = 0;
        int ix = 0;
        for(int i = 0; i < len; i++) {
            if(bits < 5) {
                acc |= (((ix < b.length) ? b[ix] : 0) << (8 - bits));
                bits += 8;
                ix++;
            }
            res[i] = b32[(acc & 0xF800) >> 11];
            acc <<= 5;
            bits -= 5;
        }
        return res;
    }
    private static char[] decompress(byte[] b) {
        return null;
    }
    private static byte[] base32decode(char[] c) {
        return null;
    }
    private static String encode(String s) {
        return "bq--" + new String(base32encode(compress(s.toCharArray())));
    }
    private static String decode(String s) {
        return new String(decompress(base32decode(s.substring(4).toCharArray())));
    }
    private static char hexdigit[] =
                      { '0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    private static String toHex(byte[] ba) {
      StringBuffer sb = new StringBuffer("");
      for (int i = 0; i < ba.length; i++) {
          sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
          sb.append(hexdigit[ba[i] & 0x0F]);
      }
      return sb.toString();
    }
    public static void main(String[] args) {
        // test compress
        char[] c1 = { '\u012D', '\u0111', '\u014B' };
        byte[] b1 = compress(c1);
        System.out.println("012D114B=" + toHex(b1));
        char[] c2 = { '\u012D', '\u00E0', '\u014B' };
        byte[] b2 = compress(c2);
        System.out.println("012DFFE04B=" + toHex(b2));
        char[] c3 = { '\u1290', '\u12FF', '\u120C' };
        byte[] b3 = compress(c3);
        System.out.println("1290FF990C=" + toHex(b3));
        char[] c4 = { '\u012D', '\u00E0', '\u24D3' };
        byte[] b4 = compress(c4);
        System.out.println("D8012D00E024D3=" + toHex(b4));
       
        // test base32 encode
        byte[] b5 = { (byte)0x3a, (byte)0x27, (byte)0x0f, (byte)0x93 };
        char[] c5 = base32encode(b5);
        System.out.println("hitq7ey=" + new String(c5));
       
        // test danish
        System.out.println(encode("ÆØÅæøå"));
    }
}
Avatar billede arne_v Ekspert
10. august 2003 - 18:19 #4
Kunne du bruge det til noget ?
Avatar billede arne_v Ekspert
27. august 2003 - 23:50 #5
??
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