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



  • Bei Dezimalzahlen nennt man das BCD ... ein alter Hut 🙂



  • lowbyte schrieb:

    Da wir bei einer HASH Funktion zbsp. MD5 eine hexadezimalen String haben als Endprodukt, und sommit 32 byte an Speicher drauf geht, habe ich mir volgendes überlegt.

    32 bytes (oder 33) braucht's nur in ascii-darstellung. ein md5-hash hat 128 bits == 16 bytes.

    lowbyte schrieb:

    Da ja Hexadezimal wie wir wissen die Basis 16 hat, convertieren wir (überflüssig 0-9 zu 0-9) und A-F zu 10-15.
    Da die Zahlen von 0 - 15 im Speicher immer nur 4 BIT belegen können wir jetzt mit Bitoperationen, 2 char Variablen a 2Byte zu 1 char Variable zu 1Byte Komprimieren.
    Und erhalten so eine Speicher - reduktion von 50%.

    herzlichen glückwunsch. du hast gerade die umwandlung von hex-zahlen, im ascii-format, zu 'bytes' neu erfunden.
    🙂



  • +fricky schrieb:

    herzlichen glückwunsch. du hast gerade die umwandlung von hex-zahlen, im ascii-format, zu 'bytes' neu erfunden.

    Das ASCII- GeBinHexe hat doch um die 80er von VMS/UNIX aus die Welt wie ein Virus erfaßt, um Dateien Klartextlesbar zu machen. Erstaunlich, daß es fast 30 Jahre gebraucht hat, bis jemandem auffällt, wieviel Speicher man damit sinnlos wegwirft und dann auch noch der Meinung ist, auf was Revolutionäres gestoßen zu sein ...

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



  • Und er hat das in 158 Zeilen Code gepackt ... Räspäckttt !!!



  • Scheppertreiber schrieb:

    Und er hat das in 158 Zeilen Code gepackt ... Räspäckttt !!!

    Nana, schaffst Du es wirklich daraus mehr als 300 Zeilen zu machen, aber wirklich funktionale 😉



  • pointercrash() schrieb:

    Scheppertreiber schrieb:

    Und er hat das in 158 Zeilen Code gepackt ... Räspäckttt !!!

    Nana, schaffst Du es wirklich daraus mehr als 300 Zeilen zu machen, aber wirklich funktionale 😉

    Mit Pascal kein Problem 🙂



  • Scheppertreiber schrieb:

    pointercrash schrieb:

    Nana, schaffst Du es wirklich daraus mehr als 300 Zeilen zu machen, aber wirklich funktionale 😉

    Mit Pascal kein Problem 🙂

    Wenn ich gemein wäre, würde ich sagen: "Laß' sehen", aber meistens bin ich ja ein Netter 😉

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



  • Na ja, 1 Seite Pascal ~ 1 Zeile C ... 🙂



  • 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


Anmelden zum Antworten