Hex-string memory compression functions in C (MS C-Cpp) ( 50 prozent Speicher reduktion bei 0 pr



  • Es sollte nur ein hinweis sein wie man hexstrings bzw. 2 chars in ein byte gepackte bekommt. und man damit 50% speicher spart. Und für die Personen für die das eh ein alter Hase ist..sollen die breite fresse halten und nicht so Kinder kommentare abgeben.Und das das nichts revolutionärs ist weis ich selber auch..
    Den akzeptablesten Komentar den ich gelesen habe ist " Bei dezimalzahlen nennt man dies bcd code".Aber es ist schon so... Die Personen die das Maul am weitesten aufreisen,bei dennen steckt sowiso nichts oder nicht viel dahinter.

    lowbyte



  • Und auserdem bekomme ich die Signatur in Form von einem string bei QuickHashS.lib Library von Slavasoft ,bei md5 32-33 byte.
    Darum die komprimmierung von char to hex to halfbyte.
    Wen ich die Binary werte return bekäme dan wäre das natürlich verständlich, das man direct senden würde.

    lowbyte



  • lowbyte schrieb:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define zero	0
    #define one	1
    #define tow	2
    #define three 3
    #define four 4
    #define five 5
    #define six 6
    #define seven 7
    #define eight 8
    #define nine	9
    #define A 10
    #define B 11
    #define C 12
    #define D 13
    #define E 14
    #define F 15
    
    char memory_reduction(char a_ptr ,char b_ptr);
    register int convchartohex(register int c);
    
    int main()
    {
    	char a=8;		// test zeichen vom type char
    	char b='f';		// test zeichen vom type char
    	char c;
    
    	c = memory_reduction(a ,b);             // Komprimierung von 2byte zu 1byte 50% Speicher reduktion.
    	putBits(c); 
    	getchar();
    	return 0;
    }
    
    	
    char memory_reduction(a_ptr ,b_ptr)
    {
    	clock_t start, end;
    	register int i;
    	register int dec1=3;
    	register int dec2=7;
    	register char byte=0;
    
    	a_ptr = convchartohex(a_ptr);
    	b_ptr = convchartohex(b_ptr);
    	for(i = 3; i>= 0; --i)
    	{
    		if( ((a_ptr>>i) & 1)==1) {
    			//putchar('1');
    			byte = byte | (1 << dec1--);
    		} else {
    			//putchar('0');
    			dec1--;
    		}
    
    	}
    	for(i = 3; i>= 0; --i)
    	{
    		if( ((b_ptr>>i) & 1)==1) {
    		//putchar('1');
    			byte = byte | (1 << dec2--);
    		} else {
    		//putchar('0');
    			dec2--;
    		}
    
    	}
    
    return byte;
    
    }
    
    register int convchartohex(register int c)
    {
    	register int halfbyte=0;
    	if(c == '0'){
    		halfbyte = zero;
    	} else if(c == 1){
    		halfbyte = one;
    	} else if(c == 2){
    		halfbyte = tow;
    	} else if(c == 3){
    		halfbyte = three;
    	} else if(c == 4){
    		halfbyte = four;
    	} else if(c == 5){
    		halfbyte = five;
    	} else if(c == 6){
    		halfbyte = six;
    	} else if(c == 7){
    		halfbyte = seven;
    	} else if(c == 8){
    		halfbyte = eight;
    	} else if(c == 9){
    		halfbyte = nine;
    	} else if(c == 'a'){
    		halfbyte = A;
    	} else if(c == 'b'){
    		halfbyte = B;
    	} else if(c == 'c'){
    		halfbyte = C;
    	} else if(c == 'd'){
    		halfbyte = D;
    	} else if(c == 'e'){
    		halfbyte = E;
    	} else if(c == 'f'){
    		halfbyte = F;
    	}
    	return halfbyte;
    }
    

    ich verstehe den code jetzt nicht ganz. vor allem die schleifen im memory_refuction.

    aber
    c = memory_reduction(F , 4); c = '1111 0100'
    müßte auch unmgefähr so gehen:

    char memory_reduction(char a,char b)
    {
    	return convchartohex(a)<<4|convchartohex(b);
    }
    
    int convchartohex(int c)
    {
    	return c<='9'?c-'0':10+c-'a';
    }
    


  • Ja da hast du natürlich recht das das viel kürzer geht. Aber deine code ist vieleicht für Anfänger ein wenig kryptisch..

    Bei meinen for schleifen prüfe ich halt jedes bit einzeln und setze es dementsprechend.

    lowbyte



  • lowbyte schrieb:

    Ja da hast du natürlich recht das das viel kürzer geht. Aber deine code ist vieleicht für Anfänger ein wenig kryptisch..

    das sehe ich ein. ich hab ?: auch nur genommen, weil ich dachte, im C-forum gehört das zum guten ton.

    die konstanten für die zahlen kann ich aber nicht einsehen. wozu sollte jemand one statt 1 schreiben wollen? mal ganz von tow zu schweigen. 🙂

    int convchartohex(int c) 
    {
    	switch(c)
    	{
    		case '0': return  0;
    		case '1': return  1;
    		case '2': return  2;
    		case '3': return  3;
    		case '4': return  4;
    		case '5': return  5;
    		case '6': return  6;
    		case '7': return  7;
    		case '8': return  8;
    		case '9': return  9;
    		case 'a': return 10;
    		case 'b': return 11;
    		case 'c': return 12;
    		case 'd': return 13;
    		case 'e': return 14;
    		case 'f': return 15;
    		default: return 0;
    	}
    }
    


  • volkard schrieb:

    das sehe ich ein. ich hab ?: auch nur genommen, weil ich dachte, im C-forum gehört das zum guten ton.

    bin auch deiner Meinung, ?: sollte eigentlich bekannt sein. Vielleicht ist das weniger kryptisch 😉

    int convchartohex(int c) 
    {
        if(c >= '0' && c <= '9')
            return c - '0';
        if(c >= 'a' && c <= 'f')
            return 10 + c - 'a';
        return 0;
    }
    


  • pointercrash() schrieb:

    Meine absoluten Haß- Parameter bei RS232 sind übrigens Klartext per 8N1 zu senden .. wer errät, warum?

    wenn man irgendwo im bitstrom einhakt, kann's passieren, dass man nur noch quatsch bekommt und es synchronisiert sich auch nicht mehr.
    🙂



  • helo

    Für mich ist di convchartohex() verständlch.. so müsste es aussehen..für mich ist es jedenfals kurz genug.

    char convchartohex(char ptr_a)
    {
    	if(ptr_a >= 'a' && ptr_a <='f'){
    		return 10 + (ptr_a - 'a');
    	}
    	if(ptr_a >= '0' && ptr_a <='9'){
    		return ptr_a - '0';
    	}
    	return 0;
    }
    

    Aber die anweisung ..hat glaube ich volkard geschriben, verstehe ich nicht..

    char memory_reduction(char a,char b)
    {
        return convchartohex(a)<<4|convchartohex(b); <----
    }
    

    könntest du mir erklären wie du mit der anweisung die zwei covertierten werte in das byte quetschst ? stimmt so sicher,doch ich verstehe es halt nicht ganz.

    lowbyte

    memory_reduction(char a,char b)
    {
    return convchartohex(a)<<4|convchartohex(b);
    }



  • char memory_reduction(char a,char b)
    {
        int ahex=convchartohex(a);
        int bhex=convchartohex(b);
        int ahexUm4NachLinksVerschoben=ahex<<4;
        int ergebnis=ahexUm4NachLinksVerschoben+bhex; // | statt + ist noch cooler
        return ergebnis;
    }
    


  • Oh man der Thread ist so geil hab mir den Arsch abgelolt.



  • ja dan lol mal schön...du spass vogel



  • high schrieb:

    ja dan lol mal schön...du spass vogel

    lol



  • Müssen wir uns wirklich auf dem Level unterhalten ..
    lowbyte hat es ja ein gesehen und ist sicher nicht so ein Profi wie du.
    Auserdem hat er die convchartohex() funktion angepasst. Und der rest ist geschmackssache.
    Und wen man halt als Ausgangswert bei den Hashfunktionen einen char vector hat.
    Dan kommt man wohl nicht drum rum,den speicher zu reduzieren.Oder man lässt es auch einfach sein.

    high



  • +fricky schrieb:

    pointercrash() schrieb:

    Meine absoluten Haß- Parameter bei RS232 sind übrigens Klartext per 8N1 zu senden .. wer errät, warum?

    wenn man irgendwo im bitstrom einhakt, kann's passieren, dass man nur noch quatsch bekommt und es synchronisiert sich auch nicht mehr. 🙂

    Das ist nur die halbe Antwort, aber soweit richtig. Das 8. Bit ist bei Klartextmeldungen (ASCII bis max 127d) auf die maximal sinnloseste Art eingesetzt worden. Keine Parity, die einen framedrop/resync auslösen würde, stattdessen abstruse wait/timeout- Regeln.
    Ist mir aber nicht nur einmal untergekommen, sondern mir fallen spontan zwei Beispiele ein. Erstmal so ein Laborzeugs- Produzent, der seine Zentrifugen, Öfchen, Pipettierautomaten per RS232 zusammengenagelt hat, dieselbe Krankheit nochmal bei Autotestständen, sogar herstellerübergreifend.

    Zum Thema:
    Was soll so eine Compression im Source- Bereich? Man müßte sie entweder als Source- Nachbesserung unterbringen, aber da wäre es geeigneter, das GeBinHexe von vorneherein rauszuwerfen. Als externes Programm ist das Methoden- Sammelsurium von Zip&Co sicherlich effektiver. Als schnellen Packer dazwischen, an bestimmte Dateiendungen gebunden, könnte man das an die eine oder andere Geschichte rantricksen, aber mit Sicherheit auch das eine oder andere System stören.
    Klartext- Hex- Dateien auf diese Art zusammenzuraffen, macht keinen Sinn, jedenfalls sehe ich gar kein Einsatzgebiet. 😕



  • 32 Byte zippen *hmmpfff* Na ja, weißt Du wie der Algorythmus funktioniert ?



  • Scheppertreiber schrieb:

    32 Byte zippen *hmmpfff* Na ja, weißt Du wie der Algorythmus funktioniert ?

    Grob, ja. Da wird so eine Library angelegt, die quasi die optimalen Grundvektoren auf das dekomprimierte Objekt enthält und die braucht mehr als 32 Byte.
    Aber ein Intel- Hex- File ist meist etwas fetter als 32 Byte. So 600 kB Intel- Hex per Zip zusammengestaucht sind eher 30 kB als 300.



  • helo

    Meine Idee war es eigentlich auf diese weise ein Hex-string wie eine MD5 Signatur,zu komprimieren um so hash tables anzulegen.
    Aus 32byte(stringsize) also 50% zu sparen. und dan die 16 Byte Binary in das File zu schreiben.

    Oder ist die Idee völiger schwachsinn..?

    lowbyte



  • Nein, die Idee ist kein Schwachsinn. Hätte ich 1 Mio solcher Werte zu speichern
    würde ich mir darum auch Gedanken machen. Bei den heutigen Speichermengen ist das
    aber nicht mehr so wild. Selbst eine Mio Werte wären 32 MB, nicht die Welt. Das
    packt sogar Windows 🙂



  • helo

    Das dachte ich auch ..
    Wie würdest du jetz die bytes in einem file speicher?

    etwa so?
    write(string_komprimiert ,sizeof(string komprimiert) ,1 ,ptr);

    Das file sollte nach meine vorstellungen so aussehen.

    zeile: (komprimierte 16byte),password

    Ich habe aber jetz milliarden von werten..

    lowbyte



  • helo

    Das ist noch meine Variante der memory_reduction()

    char memory_reduction(a_ptr ,b_ptr)
    {
       char a ,b;
    
       a = convchartohex(a_ptr);
       b = convchartohex(b_ptr);
    
       a = a<<4;
       return b|a;
    
    }
    

    lowbyte


Anmelden zum Antworten