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!
- 1664 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
"URL mérete véges (max 255 byte)"
? Ez hol maximális méret?
- A hozzászóláshoz be kell jelentkezni
Ja. A domain lehet max 255 az url a post size limitbe fog maximum belehalni, azt pedig mb-ban adják meg legtöbbször.
- A hozzászóláshoz be kell jelentkezni
Jogos. Tényleg a domainre van csak specifikációs limit, az URL-é csak implementációs.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Base64 még így is játszhat és még tömörítesz is vele. ;) 12 hexa-ból lesz 3 bájt Base64-ed...
--
http://www.naszta.hu
- A hozzászóláshoz be kell jelentkezni
Igen, de nem én határozom meg a paraméterek típusát, ugyanis egy bittorrent tracker frissítésére kell a fenti kód :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
koszi a linket.
amugy erre az allitasra reflektaltam: "és még tömörítesz is vele."
bar ahogy latom van mogotte egy kacsintosszmajli is, szoval lehet, hogy a viccet nem ertettem.
udv,
sbalazs
- A hozzászóláshoz be kell jelentkezni
jessszzus mit bonyolítotok meg mit nem ért ezen valaki
1 db hexa: 16 féle lehet (0-9a-f)
1 db base64: 64 féle lehet
tehát azonos hosszon több infó tárolható, tehát azonos infó kevesebb hosszon
nem kell ehhez még érettségi sem
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
ott kezdődött hogy a base64 használható tömörítésre (naszta)..
nyilván nem a byte-hoz(8bit), hanem az az előtti hsz-ban szereplő hexához(4bit) képest értette a tömörítést, a base64 6bit
- A hozzászóláshoz be kell jelentkezni
Igen, úgy értettem. :)
--
http://www.naszta.hu
- A hozzászóláshoz be kell jelentkezni
mit nem ért ezen valaki - fent kifejtettem. a masik hozzaszolasod segitett eszrevenni, hogy atsiklottam a 4bit hosszu kodkeszleten. itt koszonom meg.
udv, sbalazs.
- A hozzászóláshoz be kell jelentkezni
>... és a byte tömböt nem tudom adatveszteség nélkül String-re konvertálni.
new String(byte[] bytes, String charSet ) ?
- A hozzászóláshoz be kell jelentkezni
Igen, de mégis milyen charset-tel próbálkozzak? Mert a US-ASCII csak 7-bites kódolás, UTF-8 is az ASCII karaktereket tárolja 1 bájton, így az sem jó.
- A hozzászóláshoz be kell jelentkezni
hali,
lehet, hogy tevedek, de a karakterkodolasnak szerintem addig nincs jelentosege, amig nem akarod megjeleniteni. szoval lehet utf-8 akar. ha tudod tesztelni, egy probat meger.
szerk: FIXME, ha nem igy van.
udv,
sbalazs.
- A hozzászóláshoz be kell jelentkezni
utf-8-ban nem minden bajtsor szabalyos. Hiba lehet belole.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
Ez persze csak úgy fog menni, ha a request encodingja is ugyanaz, és még az is lehet, hogy a szerver nem támogat mindent.
- A hozzászóláshoz be kell jelentkezni
azért a CP819 elég csábító, alias ISO-8859-1 :)
- A hozzászóláshoz be kell jelentkezni
ha nem adsz meg charSet-et, akkor a JVM default charsetet fogja használni string kezeléskor. Ez nem feltétlenül ugyanaz, mint ami a request encodingban van beállítva. Ezzel semmikép nem játszanék, mert csak önmagadat fogod szívatni. A Base64 kell neked.
- A hozzászóláshoz be kell jelentkezni
1023, de igazad van a többiben. ezt el kell POST-olni, arra találták ki.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
nekem anno proxyn (ffproxy) default 1024 volt, es neha elofordult, hogy az keves volt, pl. yahoo mailnel is. 4096-al mar nem volt gond.
szeirntem ha sok az adat akkor inkabb POST, url-be nem jo a nagyon hosszu
A'rpi
- A hozzászóláshoz be kell jelentkezni
tény, de 512 felett már design failure gyanús, hogy annyit querystringben küld valaki.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Picit feljebb irja, hogy egy torrent tracker frissitesere hasznalja, ebbol kovetkezik, hogy a szerver oldal adott.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni