Avatar billede natsortsort Nybegynder
05. december 2007 - 12:46 Der er 5 kommentarer og
1 løsning

kryptering light

Hej,
Jeg har en lille mængde data som jeg skal have sendt fra en database til en anden, hvor det fylder så lidt som muligt - målt i antal tegn.

Helt specifikt har jeg 150 begivenheder med alle kombinationsmuligheder som skal registreres.
Det kan helt enkelt gøres med et binært system. Men det vil kræve 150 tegn at angive om de 150 begivenheder er aktive eller ej.

Jeg har tænkt i en løsning der hedder, hvor man deler op som her:
4 begivenheder kan beskrives med 1 tegn på følgende måde:

1: x0000
2: xx000
3: xxx00
4: xxxx0
5. xxxxx
6. 0 xxxx
7. 00xxx
8.000xx
9. 0000x
osv.

Det giver i alt 16 mulige løsninger (4! / 2 +4) = 16

Da jeg for hvert tegn har 1 byte svarende til 256 muligheder. Tænker jeg at man må kunne komprimere 150 begivenheder i alle tænkelig kombinationsmuligheder på en smart måde.

Min egen løsning vil kunne beskrive 150 begivenheder i alle kombinationer på 30 tegn. (150 / 5)
Forstået at man kan forklare 5 begivenheder pr tegn.

Men da der 256 muligheder i et felt og jeg med ovenstående kun bruger (5*4*3*2*1/2)+4 = 64 af dem, går resten vel til spilde. Så jeg tænker at der findes en smart måde at udnyttet hver enkelt byte så jeg kan beskrive de 150 begivenheders kombinationer på mindre en 30 tegn.

Er der nogen som har et forslag til en løsning?

natsort
Avatar billede pidgeot Nybegynder
05. december 2007 - 13:01 #1
Den mest pladsbesparende løsning er at anvende REELT binær data, og ikke en streng af 1'er og 0'er - brug bitvise operationer (shifting, OR) for at danne byte-værdeier

Jeg kender ikke dit programmeringssprog (du har ikke angivet et), så det er svært at være meget mere specifik, men her har du noget pseudokode til generering af strengen:

Del op i grupper á 8 begivenheder
For hver gruppe:
  Sæt en variabel b til 0
  For hver begivenhed i gruppe:
    Sæt b = b ShiftLeft 1
    Hvis begivenhed = 1 (sand), så b = b or 1
  Hvis gruppe har færre end 8 begivenheder, sæt b = b ShiftLeft (8 - AntalBegivenhederIGruppe)
  Tilføj byte til streng
Indsæt byte i database (husk brug af escaping, parameters, etc. for at undgå fejl hvis der har sneget sig en apostrof eller andet ugyldigt tegn ind)
Avatar billede natsortsort Nybegynder
05. december 2007 - 13:15 #2
Jeg programmerer i Java (j2ME).
Avatar billede natsortsort Nybegynder
05. december 2007 - 13:25 #3
Jeg fik ikke lige sagt at det i sidste ende skal skrives ud som en en ASCII tekst - og fylde så lidt som muligt.

Eks. q2ww, så ved jeg at du er subscribet til en unik kombination af alle de 150 begivenheder.
Avatar billede pidgeot Nybegynder
05. december 2007 - 19:00 #4
Når du siger "ASCII-tekst", mener du så noget der kan læses af mennesker, eller bare noget der kan proppes i en string? Hvis det første, så brug Base64-encoding af resultatet (6 begivenheder pr. tegn, altså 25 tegn).

Den mest pladsbesparende får du kun ved at opbygge bytes (du skal vist gennem char, men kan ikke huske om du kan bruge den direkte, eller om det skal være som et typecast el. lign.) og så tilføje bytesene en ad gangen til en string. Shifting skulle vist være << og OR |, men det er længe siden jeg har arbejdet med Java, og ved ikke om der er særlige ting man skal vide med J2ME.
Avatar billede natsortsort Nybegynder
07. december 2007 - 09:20 #5
super pidgeot laver du et svar - så jeg kan give point.
Avatar billede pidgeot Nybegynder
07. december 2007 - 09:24 #6
S'gerne :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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