[corba] IOR string in 255 characters frotten

Pagina: 1
Acties:

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 15:03

voodooless

Sound is no voodoo!

Topicstarter
Het probleem is al volgd:

Wij willen een Corba service via howl (zeroconf) broatcasten over een subnet. Zo hoeft de user alleen nog maar de naam van de server aan te klikken, en hoeft verder niets te weten van adressen en poortnummers.

Nu moet er via howl de IOR (interoperable object reference) doorgegeven worden aan de client, zodat deze de service kan vinden. De IOR is gewoon een string en ziet er als volgt uit:
IOR:010000001300000049444c3a48656c6c6f576f726c643a312e
30000002000000000000003f000000010100001d00000064656661696e
742e646565707370616365392e787334616c6c2e6e6c00001f9f1300000
02f383530342f313037393030323038362f5f30000100000024000000010
0000001000000010000001400000001000000010001000000000009010
10000000000
(de enters ff weghalen, is alleen om de layout niet op te fucken 8)7 )

Het ding is altijd rond de 300 karakters groot. En hier is dan ook het probleem: De string die we via howl kunnen verzenden mag maar maximaal 255 karakters lang zijn. Fucked dus...

Maar een oplossing lijkt eenvoudig. Als je naar de string kijkt, dan is deze opgebouwt uit allemaal hex getallen achter elkaar, echter gewoon als karakter weergegeven. De "OIR:" in het begin is ook overbodig, die staat er toch altijd.

Nu is het dus zaak om een manier te vinden om de string te encoden (en natuurlijk te decoden, zodat ie in 255 karakters past. Encoding moet gewoon in C++ of C gebeuren, decoding aan de cleint side in java en Objective C. Moet dus een beetje crosplatform/taal zijn (lijkt me niet zo'n probleem).

Nu is dus de vraag wie een idee heeft hoe je zo'n string het beste zou kunnen coderen?

Men zou gewoon het alfabet kunnen uibreiden, zodat "00" bv "g" wordt e.d, maar dan kan ik net de hele "xx" reeks afdekken. Misshien genoeg om het te laten passen... Zoals je ziet komt er vaak 00 voor. Dat hoeft echter niet altijd zo te zijn (hoewel ik het al heel veel gezien heb)..

Maar misschien hebben jullie wel een beter idee. Alle sugessties zijn welkom B)

Do diamonds shine on the dark side of the moon :?


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 15:03

voodooless

Sound is no voodoo!

Topicstarter
Ow, ik denk dat ik zelf al een oplossing heb gevonden :)

Zie volgende java proggie (ik andere talen ook wel makkelijk na te maken:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.*;
 
public class test {
 
        public static void main(String args[]){
                String ior = "IOR:010000001300000049444c3a48656c6c6f576f726c643a312e3000"
                +"0002000000000000003f000000010100001d00000064656661696e742e646565707370"
                +"616365392e787334616c6c2e6e6c00001f9f130000002f383530342f31303739303032"
                +"3038362f5f300001000000240000000100000001000000010000001400000001000000"
                +"01000100000000000901010000000000";
                if (args.length>0){
                        ior = args[0];
                }
                System.out.println("\r\noriginal ior: "+ior);
                System.out.println("size: " +ior.length());
                String enc = encode(ior);
                System.out.println("\r\nencoded ior: "+enc);
                System.out.println("size: "+enc.length());
                String dec = decode(ior);
                System.out.println("\r\ndecoded ior: "+dec);
                System.out.println("size: "+dec.length());
 
                if(dec.compareTo(ior)==0){
                        System.out.println("\r\ncompression/decompression succesfull!");
                } else {
                        System.out.println("\r\ncompression/decompression failed!");
                }
        }
 
        public static String encode(String ior){
                ior = ior.replaceAll("IOR2:","l");
                ior = ior.replaceAll("IOR:","k");
                ior = ior.replaceAll("00","x");
                ior = ior.replaceAll("xx","y");
                return ior.replaceAll("yy","z");
        }
 
        public static String decode(String ior){
                ior = ior.replaceAll("l","IOR2:");
                ior = ior.replaceAll("k","IOR:");
                ior = ior.replaceAll("z","yy");
                ior = ior.replaceAll("y","xx");
                return ior.replaceAll("x","00");
        }
 
 
}


output (op de command line kun je zelf nog andere IOR strings opgeven):
original ior: IOR:010000001300000049444c3a48656c6c6f576f726c643a312e30000002000
000000000003f000000010100001d00000064656661696e742e646565707370
616365392e787334616c6c2e6e6c00001f9f130000002f383530342f313037393
030323038362f5f3000010000002400000001000000010000000100000014000
0000100000001000100000000000901010000000000
size: 300

encoded ior: k01yx13yx49444c3a48656c6c6f576f726c643a312e3yx2zyx3fyx0101y1dyx64656
661696e742e646565707370616365392e787334616c6c2e6e6cy1f9f13yx2f3835
30342f313037393030323038362f5f3y1yx24yx01yx01yx01yx14yx01yx01x01zx0
90101zx
size: 208

decoded ior: IOR:010000001300000049444c3a48656c6c6f576f726c643a312e300000020000
00000000003f000000010100001d00000064656661696e742e64656570737061
6365392e787334616c6c2e6e6c00001f9f130000002f383530342f313037393030
323038362f5f30000100000024000000010000000100000001000000140000000
100000001000100000000000901010000000000
size: 300

compression/decompression succesfull!
compressieverhouding van 1/3 ongeveer. door nog meer tekens samen te voegen kan het nog wel beter denk ik, maar het meeste haal je er zo al uit :)

Verder suggesties zijn natuurlijk welkom, en anders is dit topic voor iemand die zelf zo'n probleem tegekomt :)

Do diamonds shine on the dark side of the moon :?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Zoals je zelf al aangeeft kan je die object reference net zo goed in binary vorm oversturen, als dat kan binnen je netwerkprotocol. Dan halveer je de grootte. Maar dat is het paard achter de wagen spannen.

Die stringified object references zijn gewoon niet zo geschikt om heen en weer te sturen. Er zit een heleboel redundante informatie in; dit zit er allemaal in jouw IOR:
Repo Id: IDL:HelloWorld:1.0

IIOP Profile
Version: 1.0
Address: inet:defaint.deepspace9.xs4all.nl:40735
Location: corbaloc::defaint.deepspace9.xs4all.nl:40735//8504/1079002086/%5f0
Key: 2f 38 35 30 34 2f 31 30 37 39 30 30 32 30 38 36 /8504/1079002086
2f 5f 30 /_0

Multiple Components Profile
Components: Native Codesets:
normal: ISO 8859-1:1987; Latin Alphabet No. 1
wide: ISO/IEC 10646-1:1993; UTF-16, UCS Transformation Format 16-bit form
Key: (empty)
Aardig wat dus. Een heleboel van die informatie kan de ORB ook wel uitvinden met een LocateRequest (zoals die codesets enzo).

Je zou dus liever een stringrepresentatie willen gebruiken die alleen de essentiële informatie bevat die noodzakelijk is om contact te maken met de server. Jouw ORB kan dan allerlei details wel opvragen bij de ORB waar het object zich bevindt. Daar is nu precies de die corbaloc-notatie voor uitgevonden; die bevat uitsluitend de host en port waarop de ORB luistert en de object key waarmee het object in de ORB wordt geïdentificeerd (daar zit meestal ook een pad naar de POA in verwerkt). Het formaat van zo'n corbaloc string kun je al in m'n quote zien; in het algemene geval is het corbaloc:iiop://IIOPVersion@hostname:port/ObjectKey. Die IIOPVersion mag je weglaten als je IIOP 1.0 gebruikt, vandaar dat het in jouw geval corbaloc::defaint.deepspace9.xs4all.nl:40735//8504/1079002086/%5f0 wordt.

Kort samengevat: stuur gewoon die corbaloc-notatie over, dan ben je met 68 karakters klaar (in plaats van 300) en hoef je waarschijnlijk helemaal niets in je (ontvangende) code te veranderen. Als je echt krenterig wilt gaan doen kun je in plaats van je hostname je IP-adres meesturen; dat scheelt in dit geval toch weer een stuk of 15 karakters.

[ Voor 14% gewijzigd door Soultaker op 26-05-2004 02:12 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
OMG, die compressor van jouw raakt ook kant nog wal. :P Ga je eens inlezen over sliding window of Huffman compression ofzo! ;)

offtopic:
Heb je nu je hostname fout gespeld of lijkt dat maar zo?

[ Voor 38% gewijzigd door Soultaker op 26-05-2004 01:47 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 15:03

voodooless

Sound is no voodoo!

Topicstarter
Thanks Soultaker! Goeie tip! Als je deze URL's ook zonder naming service kan gebruiken, dan is dat een veel elegantere oplossing :).

Tja, mijn "compressie" is ook maar ff snel in 5 min bedacht. Raakt idd kant nog wal, maar werkt wel. Maar die URL's bevallen mij toch beter, dus gaan we dat maar gebruiken. Was in ieder geval een leuk experiment ;)

Yep hostname is fout gespeld, maar da's met opzet })

[ Voor 59% gewijzigd door voodooless op 26-05-2004 01:50 ]

Do diamonds shine on the dark side of the moon :?