byte tömb URL-be

Fórumok

Szevasztok!

Lenne egy kérdésem: tud valaki elegáns módszert arra hogy hogyan lehet egy byte tömböt (amelyben a bájtokat előjel nélkülinek fogjuk fel) URL-be elkódolni?

Amúgy van rá egy megoldásom, csak kíváncsi vagyok hogy van-e rá más/jobb/egyszerűbb.

Előre is kösz a választ!

Hozzászólások

Tekintettel arra, hogy az URL mérete véges (max 255 byte), én base64-be raknám az adatot, és mint string adnám át (de méginkább nem adnék át tömböt url-ben). Kevesebb karaktert pazarol, mintha minden tömbelemet külön változóként hivatkoznál. Neked mi a megoldásod? Majd írd meg, kiváncsi vagyok.

Bocs, nem írtam le elég jól a helyzetet: a base64 jó dolog, de nekem mindenképpen sima hexa kódolás kell. A kódom:


public class URLUtils {

private static final char[] hexaDigits = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};

public static String encodeRawByteArray(byte[] b) {

if (b == null) {
return "";
}
StringBuilder encoded = new StringBuilder(b.length * 3);
int val = 0;
char chr;
for (int i = 0; i < b.length; i++) {
chr = (char) b[i];
if ((chr >= 'a' && chr <= 'z')
|| (chr >= 'A' && chr <= 'Z')
|| (chr >= '0' && chr <= '9')) {
encoded.append(chr);
} else {
val = b[i] & 0xFF;
encoded.append('%');
encoded.append(hexaDigits[val >>> 4]);
encoded.append(hexaDigits[val & 0xf]);
}
}
return encoded.toString();

}

}

Igazából csak arra vagyok kíváncsi, meg lehet-e oldani valahogy egyszerűbben. Van egy URLEncoder osztály a Java könyvtárban, de az csak stringekre használható, és a byte tömböt nem tudom adatveszteség nélkül String-re konvertálni.

ezt a tomoritest tudnad peldaval szemleltetni? nem ertem... :(

szerk: valoszinuleg az en interpereterem a bugos, de en a fenti allitasodat haromfelekeppen tudnam ertelmezni:
- 0x12-t abrazolsz 3 bajton, ami esetben a tomorites egyertelmuen kizarva (1 bajt vs 3 bajt)
- int 12-t, azaz 0x0C-t abrazolsz 3 bajton -> detto
- 12 byte hosszu stringet abrazolsz 3 byte-on -> gondolom erre celoztal, de pl: base64enc("123456") == "MTIzNDU2" && base64enc("asdfgh") == "YXNkZmdo"

sbalazs.

3db 8bites blokkot 4db 6bitesként veszel, felbovited 8 bitesre mindet (két 0 bit az elejére), így minden byte ASCII7bit-re fog esni. cserébe 4/3-szorosára nő a helyigénye.

http://en.wikipedia.org/wiki/Base64

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

forditva, mert ez nem tömörítés.
plz olvasd el a szocikket. a szukebb ertekkeszletre lekepezes soran meretnovekedes allt elo.

Base64 encoding schemes are commonly used when there is a need to encode binary data that needs be stored and transferred over media that are designed to deal with textual data.

Note that given an input of n bytes, the output will be (n + 2 - ((n + 2) % 3)) / 3 * 4 bytes long, which converges to n * 4 / 3 or 1.33333n.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

jaja, elég hülye ötlet az utf, nem is értem hogy juthat valakinek az eszébe :), de ezek működnek (iconv-val szinonímákat is kaphatsz):

437 850 852 855 860 861 862 863 865 866 ATARI CP1124 CP1125 CP1129 CP1131 CP1163 CP1256 CP154 CP737 CP775 CP819 CP858 CP922 CYRILLIC GEORGIAN-ACADEMY GEORGIAN-PS ISO-8859-10 ISO-8859-13 ISO-8859-14 ISO-8859-15 ISO-8859-16 ISO-8859-2 ISO-8859-4 ISO-8859-9 KOI8-R KOI8-RU KOI8-U MACCENTRALEUROPE MACCYRILLIC MACUKRAINE RISCOS-LATIN1 TCVN UCS-4-INTERNAL UCS-4-SWAPPED UCS-4BE UCS-4LE VISCII

A HTTP specifikáció nem mond semmit az URL maximális hosszáról. Innentől böngészője, web- vagy proxyszerevere válogatja, hogy mennyi után dob hibát vagy lesz vállalhatatlanul lassú.
Olyan 2000 karakter körül van a limit, amivel még az elterjedtebb szoftverek mindegyike elbír.
--
geri / otperc.net

Van erre standard eljárás, minden egyes hexában megadott byte elé teszel egy % jelet. Azaz pl. a "tesztüzenet" string hexában "74 65 73 7A 74 FC 7A 65 6E 65 74", ezt kódolod az urlbe így: "%74%65%73%7A%74%FC%7A%65%6E%65%74"

De máris kijavítom magam, valójában így csak a nem betűket szokás átkódolni. Azaz a "tesztüzenet" szabályosan urlencodeolva "teszt%FCzenet". Ha teheted, használj erre beépített függvényt, javat annyira nem ismerem, de hátha ezek segítenek: phpban az urlencode, javascriptben az escape függvény végzi ezt az encodeolást stringből.

A végére pedig egy link: http://www.albionresearch.com/misc/urlencode.php

--
Don't be an Ubuntard!