Toon posts:

[C++] Zelfgemaakte Compressie

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben nieuw hier, en zal me ff introduceren ;)
Mwa, lees mn profile maar,

ik werk al best lang met C++ en heb een compressie ontwikkelt voor tekst
bestanden, maar heb ff 2 vraagies ;)

-Ik heb een character nodig die je nooit in een bestand tegenkomt, ik heb hem
nodig om een speciaal commando aan te duiden, bijv:
char *commando* char

-Mn programma schijnt alleen te werken met tekst bestanden, want als ik iets anders wil laten "inpakken" geeft ie alleen de eerste paar characters aan en stopt ie???

hij gebruikt:

char buffer[10500]
getline (buffer, 10000)

mot ik misschien de type van buffer veranderen, want de inhoud van de andere bestanden (bmp, jpg, mp3, mid, etc) != inhoud van een tekstbestand

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 02 October 2003 @ 23:03:
Ik ben nieuw hier, en zal me ff introduceren ;)
Mwa, lees mn profile maar,
Welkom op GoT en in Programming & Webscripting, en dank voor het skippen van de uitleg over jezelf ;)
-Ik heb een character nodig die je nooit in een bestand tegenkomt, ik heb hem nodig om een speciaal commando aan te duiden, bijv:
char *commando* char
Die bestaat niet. Iedere byte kan voorkomen in een bestand: je zult dus een 'very unlikely moeten kiezen (niet 0) en die eventueel 'escapen' mocht hij toch voorkomen. Bijvoorbeeld als je 169 gebruikt, moet daar een getal van 1 tot 255 achter komen om 'compressie-element' te zijn, maar als er 0 achter staan is het gewoon 1 keer 169.

Alle gangbare byte-run compression algorithms werken op deze manier.
-Mn programma schijnt alleen te werken met tekst bestanden, want als ik iets anders wil laten "inpakken" geeft ie alleen de eerste paar characters aan en stopt ie???

hij gebruikt:

char buffer[10500]
getline (buffer, 10000)
Ik durf er wat onder te verwedden dat er na die paar characters een 0-byte of een newline of een carriage return staat, wat getline(...) ziet als het einde van die regel. Je kunt dus niet met getline, wat voor tekstbestanden bedoeld is, binaire data uitlezen.

Professionele website nodig?


  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04-2025

[ash]

Cookies :9

Welkom :P

[quote]Verwijderd schreef op 02 October 2003 @ 23:03:
-Ik heb een character nodig die je nooit in een bestand tegenkomt, ik heb hem
nodig om een speciaal commando aan te duiden, bijv:
char *commando* char[/quote]Wat dacht je van:
[list]
• ?
• |
• >
• <
[/list]


edit:
Lig al een beetje te slapen, dacht dat de TS een character in de bestandsnaam bedoelde :X.

curry684:
volgens mij was mijn post de eerste reactie op dit topic, of ik slaap al 8)7

[ Voor 25% gewijzigd door [ash] op 02-10-2003 23:17 ]


  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

Verwijderd schreef op 02 oktober 2003 @ 23:03:
heb een compressie ontwikkelt voor tekst

...

-Ik heb een character nodig die je nooit in een bestand tegenkomt, ik heb hem
nodig om een speciaal commando aan te duiden, bijv:
char *commando* char

-Mn programma schijnt alleen te werken met tekst bestanden, want als ik iets anders wil laten "inpakken" geeft ie alleen de eerste paar characters aan en stopt ie???
Ten eerste: je bent niet de eerste die een compressiealgoritme heeft bedacht. En wat moet je met een algoritme dat alleen voor tekst bruikbaar is? Verder geef je toch zelf het antwoord al? Je hebt codes nodig die niet in de bronfile voorkomen, waardoor ze als commando-codes te onderscheiden zijn van de data. Dat betekent dat je nooit alle 255 tekens uit de ASCII set kunt gebruiken. Wat is het nut van een dermate beperkt bruikbare compressie? Aangezien je zelf de tegenstrijdigheid in je verhaal niet lijkt te zien vraag ik me af of je zelf wel begrijpt wat je 'ontwikkeld' hebt.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:36
Exirion schreef op 02 October 2003 @ 23:10:
Je hebt codes nodig die niet in de bronfile voorkomen, waardoor ze als commando-codes te onderscheiden zijn van de data. Dat betekent dat je nooit alle 255 tekens uit de ASCII set kunt gebruiken.
Je kunt echter wel een zeldzaam karakter opofferen en dat gebruiken als 'control character'. Vervolgens moet je natuurlijk wel een commando hebben om het originele karakter te kunnen reconstrueren (want anders kun je inderdaad geen zinnige binary files coderen) maar dat geeft niet; de overhead van het gebruik van dat commando is (hopelijk) te verwaarlozen ten op zichte van de winst die je met de compressie behaald.

  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

Soultaker schreef op 02 October 2003 @ 23:16:
Je kunt echter wel een zeldzaam karakter opofferen en dat gebruiken als 'control character'. Vervolgens moet je natuurlijk wel een commando hebben om het originele karakter te kunnen reconstrueren (want anders kun je inderdaad geen zinnige binary files coderen) maar dat geeft niet; de overhead van het gebruik van dat commando is (hopelijk) te verwaarlozen ten op zichte van de winst die je met de compressie behaald.
Wat ook wel wordt gedaan is om data om te vormen van een bytestream naar een bit-stream, per 9 bits, zodat je de extra bit als codebit kunt gebruiken. Je moet dan met je compressie wel voldoende winst halen om die extra bit te compenseren.

Maar even over de topic als geheel: er zijn talloze compressie algoritmen. Kan de topicstarter niet beter gewoon eens wat artikelen en/of boeken over compressie lezen? Da's handiger dan dat we hier allerlei feiten en uitleggen over compressie aan het opsommen zijn.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


Verwijderd

Topicstarter
Ik weet natuurlijk wel wat ik gemaakt heb, maar ik doe nie zo werken met die bytes, ik check naar herhalingen, tot 10 chars vooruit, voorbeeld: ¥10¥ALGEBRA!!!¥, dan staat er gewoon 10 keer achterelkaar ALGEBRA!!!

Werkt wel, maar is nog nie zo goed is ik gepland had, o ja, nog ff op die \0 char, da snap ik wel, want daarmee checkt mn programma wanneer hij de volgende regel in buffer moet zetten, best wel chill

als ik een paar foutjes heb verbeterd post ik wel de source op mn webpagina,
terwijl ik toch weet da ik nie de enigste bent die dit gemaakt heb, tis mn 5de C++ programma :S

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Exirion schreef op 02 oktober 2003 @ 23:10:
[...]

Ten eerste: je bent niet de eerste die een compressiealgoritme heeft bedacht. En wat moet je met een algoritme dat alleen voor tekst bruikbaar is? Verder geef je toch zelf het antwoord al? Je hebt codes nodig die niet in de bronfile voorkomen, waardoor ze als commando-codes te onderscheiden zijn van de data. Dat betekent dat je nooit alle 255 tekens uit de ASCII set kunt gebruiken. Wat is het nut van een dermate beperkt bruikbare compressie? Aangezien je zelf de tegenstrijdigheid in je verhaal niet lijkt te zien vraag ik me af of je zelf wel begrijpt wat je 'ontwikkeld' hebt.
:Z kom op heej, van dingen zelf doen leer je. Natuurlijk is hij niet de eerste, en dat weet hij natuurlijk ook wel. Beetje warmer onthaal voor nieuwelingen mogen ook wel hoor

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Exirion schreef op 02 October 2003 @ 23:20:
[...]
Maar even over de topic als geheel: er zijn talloze compressie algoritmen. Kan de topicstarter niet beter gewoon eens wat artikelen en/of boeken over compressie lezen? Da's handiger dan dat we hier allerlei feiten en uitleggen over compressie aan het opsommen zijn.
Er zijn heel wat verschillende compressie technieken beschikbaar, echter als iemand wilt programmeren is het uitproberen van dingen het beste wat je in principe kunt doen, juist hierdoor ga je je eigen inzicht ontwikkelen en een persoon die dit vaak doet zal uiteindelijk originele oplossingen kunnen bedenken tot problemen, en vaak kunnen die personen ook een betere oplossing aandragen dan iemand die alleen maar problemen heb opgelost door bestaande technieken te gebruiken. Juist het bedenken van nieuwe dingen leert een gedachtengang aan waardoor de inzicht juist vergroot wordt.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

.oisyn schreef op 02 oktober 2003 @ 23:26:
:Z kom op heej, van dingen zelf doen leer je. Natuurlijk is hij niet de eerste, en dat weet hij natuurlijk ook wel. Beetje warmer onthaal voor nieuwelingen mogen ook wel hoor
Nieuweling of niet, dat is niet relevant. Het gaat erom dat als je met iets aan het experimenteren bent waar je weinig achtergrondinfo van kent, en er op een gegeven moment niet uitkomt, dat je dan beter wat informatie kunt gaan verzamelen in plaats van meteen vragen te stellen. Dat geldt niet alleen voor programmeerwerk maar voor alles.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, dat hele compressieverhaal is niet relevant. Ja, daar is de TS mee bezig ja, maar dat is zijn vraag helemaal niet. Hij stelt 2 vragen, namelijk of er een character is die nooit voorkomt in bestanden, en hoe het komt dat ie binaire bestanden niet goed kunt lezen.

Ondertussen is ie bezig met compression, maar dat heeft verder weinig te maken met de vragen die ie hier stelt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

dusty schreef op 02 October 2003 @ 23:33:
Juist het bedenken van nieuwe dingen leert een gedachtengang aan waardoor de inzicht juist vergroot wordt.
Ja, vertel mij wat. Nieuwe dingen bedenken is m'n werk. Maar als je weinig kennis hebt van het veld waarin je actief bent, dan weet je ook niet wat nieuw is en wat niet. En als je er op een gegeven moment niet meer uitkomt dan heb je toch echt hulp van buitenaf nodig. En in dat geval zeg ik dus: verdiep je in het onderwerp voordat je vragen gaat stellen.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Exirion schreef op 02 October 2003 @ 23:36:
[...]
Maar als je weinig kennis hebt van het veld waarin je actief bent, dan weet je ook niet wat nieuw is en wat niet. [..]
Juist het leer proces is dingen zelf ontdekken, zonder dat je wat van de materie afweet, juist door dingen zelf te ontdekken en te proberen en niet op te zoeken leer je stukken meer dan gewoon aan de hand van een voorbeeld werken. Maar dit heeft meer met leren programmeren te maken, dan met het effectief bezig zijn met een compressie. Gewoon dingen maken om te kijken of iets kan. ( en dan hoeft het resultaat dus niet efficient te zijn).

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

dusty schreef op 02 October 2003 @ 23:41:
Maar dit heeft meer met leren programmeren te maken
OK, zijn we het daar iig over eens.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


Verwijderd

Topicstarter
Oh, dus tussen al dat gezeik (excuse my french) heb ik dus kunnen concluderen dat ik gewoon ios:bin moet gebruiken met de andere bestand typen, dank u wel :P

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21:56
Als je met deze klaar bent moet je ook eens op zoek gaan naar compresse mbv binaire bomen :P (misschien beetje irrelevant als je nog niet zoveel (C++) programmeer-ervaring hebt...)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • lordsnow
  • Registratie: Maart 2000
  • Laatst online: 27-05 23:53

lordsnow

I know nothing

Als je een makkelijke manier van character escaping zoekt, yEnc is daar ook op gebaseerd. Zie de yEnc pages op mijn homepage.

Als je herhalingen wil gaan tellen is de BWT (Bachus Wheel Transform, of zo) ook wel interessant.

Verwijderd

Topicstarter
Tnhx voor de hulp lordsnow, in tegenstelling tot die gaffels die ruzie zitten te maken hierboven ^ (pijltje voor duidelijkheid)

@Riezebosch, binaire bomen? Da lukt wel, maar ik wil ff mn hersenen heel houden, dank u wel :P

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 02 oktober 2003 @ 23:47:
Oh, dus tussen al dat gezeik (excuse my french) heb ik dus kunnen concluderen dat ik gewoon ios:bin moet gebruiken met de andere bestand typen, dank u wel :P
gebruik je nu nog steeds getline ()? Dan kun je beter fstream::read () gebruiken, die leest gewoon een aantal bytes. Dat scheelt ook een stuk qua performance, omdat er niet byte voor byte ingelezen hoeft te worden om vervolgens te kijken of er een newline langs is gekomen

(dat byte voor byte is ook niet helemaal waar, er zijn natuurlijk wel interne buffers, maar toch)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn, heb je misschien een voorbeeld hoe je fstream::read() moet gebruiken, want ik ben gewent aan getline()

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

open de documentatie, ga naar de basic_istream class, en bestudeer de read () functie ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21:56
nog ff over die binaire bomen, heb vanochtend boek erbij gepakt waar wat instond over die compressietechiek, zag in de gauwigheid het woord Huffman-algoritme staan :Y) .

edit:

google met keywords 'huffman' en 'compression' leverde iig al genoeg hits op

[ Voor 22% gewijzigd door riezebosch op 03-10-2003 23:37 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Huffman, heb ik over gelezen, nee, zo'n compressie wil ik nie eens maken (werkt / lukt wel, maar is nog fftjes teveel ;))

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

riezebosch schreef op 03 oktober 2003 @ 23:36:
nog ff over die binaire bomen, heb vanochtend boek erbij gepakt waar wat instond over die compressietechiek, zag in de gauwigheid het woord Huffman-algoritme staan :Y) .

edit:

google met keywords 'huffman' en 'compression' leverde iig al genoeg hits op
Uhm Huffman heb je het over ZIP, LHA, LZ e.d., dat is niet echt 'beginnerskost' om te leren omgaan met binary files e.d. :)

Emperor-Baal: als je op een forum een vraag stelt kun je verwachten dat er over gediscussieerd gaat worden, en dat dat soms ook niets met jou of je vraag van doen heeft. Iets vriendelijker daarmee omspringen dan met termen als 'gezeik' en 'ruziemakende gaffels' mag wel, voordat je het weet springt uit hun ruzie jouw oplossing ;)

Professionele website nodig?


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Voor het niet gebruikte character kun je bijvoorbeeld ascii 0 gebruiken, getline geeft die waarschijnlijk niet als resultaat terug, maar je kunt voor de zekerheid een commando maken dat zegt dat er een ascii 0 character in het bestand stond.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

_js_ schreef op 04 October 2003 @ 21:48:
Voor het niet gebruikte character kun je bijvoorbeeld ascii 0 gebruiken, getline geeft die waarschijnlijk niet als resultaat terug, maar je kunt voor de zekerheid een commando maken dat zegt dat er een ascii 0 character in het bestand stond.
ELKE karakter kan voorkomen in een file, vooral als je met binaire files gaat werken. Zou hij dus een goed algoritme willen maken zal hij een "escape" karakter moeten definieren, en als er tweemaal de escape karakter achterelkaar komt te staan, weet hij dat het origineel juist dat escape karakter is. Gewoonweg een karakter nemen die iets altijd aangeeft is niet een goede manier van werken.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

_js_ : 0 is een van de meest gebruikte karakters in een heleboel binaries (executables bijvoorbeeld, vooral als je ze met de C++ compiler van VS6 SP5 compiled :( )

Als je een zeldzaam karakter zoekt : bepaal het soort bestanden wat je voornamelijk gaat comprimeren, neem een representatieve set voorbeeldbestanden en tel het aantal keren dat ieder ASCII karakter er in zit. Diegene die het minste voorkomt is (waarschijnlijk) je beste keus...

edit : heeft dusty soms super-posting-powers? Mijn post-tijd is vroeger dan die van hem en toch staat zijn reactie boven de mijne >:) :O

edit2 : zijn posting heeft zelfs een tijdstip wat nog niet verstreken is. Leer mij ook es in de toekomst posten :P

[ Voor 24% gewijzigd door Verwijderd op 06-10-2003 00:09 ]


Verwijderd

overigens : een karakter die NOOIT voorkomt in bestanden (aka niet mag voorkomen) zou vrijwel onmogelijk zijn, aangezien jij neem ik aan in je programma dat karakter naar een bestand weg wil schrijven? ;)

edit : ja dit had ook een PSje kunnen zijn in mijn vorige post. Mijn nederige excuses voor mijn onvergeeflijke luiheid

[ Voor 24% gewijzigd door Verwijderd op 06-10-2003 00:09 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:36
Verwijderd schreef op 06 October 2003 @ 00:03:
edit : heeft dusty soms super-posting-powers? Mijn post-tijd is vroeger dan die van hem en toch staat zijn reactie boven de mijne >:) :O

edit2 : zijn posting heeft zelfs een tijdstip wat nog niet verstreken is. Leer mij ook es in de toekomst posten :P
Leer eens lezen: ;)

Verwijderd

Leer eens lezen
sorry, kom net van netgamez, beetje weinig geslapen dit weekend >:) :O |:(
Pagina: 1