Umwandlung von 8bit zu 7bit

Schnelle objektorientierte, kompilierende Programmiersprache.
chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Sa Mai 10, 2014 11:10 pm

Hallo zusammen,

ich bin nun endlich soweit, den Code hier einmal zu veröffentlichen, aktuell habe ich aber noch ein Problem vor mir, wo ich ein paar Fragen zu habe:

Code: Alles auswählen


int countdigits(unsigned int x)                 
{  
    unsigned count=1; 
    unsigned int value= 10; 
    while (x>=value) 
    {  
        value*=10; 
        count++; 
    }  
    return count; 
}

char * twoint2one ( unsigned int *zahl, unsigned char *septs)
{
    unsigned int i = 0, j=0;
   
    j = countdigits(zahl);
   
    printf("groesse %i\n", j);
   
    for (i=0;i<j;i++)
    {
        *septs = *zahl++ << 4;
        *septs |= *zahl;
        printf ("Int: %i  Hex: %02x \n", *septs, *septs);
        *septs++;
        *zahl++;
    }
    *septs = '\0';
}  
Was wird gemacht?
Das Ascii Array was empfangen bzw. übergeben wird muss in seinen Werten als INT umgewandelt werden.
So sieht das 1. Ergebnis aus. Folgender Hexwert kommt rein:

C8309BFD0625D172D059FE9ECFCB6E40

hieraus wird ein int array erzeugt:
Int: 12 Hex: 0c
Int: 8 Hex: 08
Int: 3 Hex: 03
Int: 0 Hex: 00
Int: 9 Hex: 09
Int: 11 Hex: 0b
Int: 15 Hex: 0f
Int: 13 Hex: 0d
Int: 0 Hex: 00
Int: 6 Hex: 06
Int: 2 Hex: 02
Int: 5 Hex: 05
Int: 13 Hex: 0d
Int: 1 Hex: 01
Int: 7 Hex: 07
Int: 2 Hex: 02
Int: 13 Hex: 0d
Int: 0 Hex: 00
Int: 5 Hex: 05
Int: 9 Hex: 09
Int: 15 Hex: 0f
Int: 14 Hex: 0e
Int: 9 Hex: 09
Int: 14 Hex: 0e
Int: 12 Hex: 0c
Int: 15 Hex: 0f
Int: 12 Hex: 0c
Int: 11 Hex: 0b
Int: 6 Hex: 06
Int: 14 Hex: 0e
Int: 4 Hex: 04
Int: 0 Hex: 00
und das wird dann zusammengeschoben ->
Int: 200 Hex: c8
Int: 48 Hex: 30
Int: 155 Hex: 9b
Int: 253 Hex: fd
Int: 6 Hex: 06
Int: 37 Hex: 25
Int: 209 Hex: d1
Int: 114 Hex: 72
Int: 208 Hex: d0
Int: 89 Hex: 59
Int: 254 Hex: fe
Int: 158 Hex: 9e
aber dieser Teil funktioniert nicht ganz korrekt in der Funktion:

Code: Alles auswählen

char * twoint2one ( unsigned int *zahl, unsigned char *septs)
   
    j = countdigits(zahl);

    for (i=0;i<j;i++)

Hier muss ich ja die länge des integers feststellen, damit das Char Array auch komplett mit den Werten gefüllt wird.
Das Zählen versuche ich aktuell mit der Funktion countdigits durchzuführen.
Diese Funktion schreibt mir heraus, dass die int Variable zahl aber nur 12 Stellen groß sei, aber Sie ist 15 Stellen groß.
Das heißt, das Ergebnis der Umwandlung wird abgeschnitten und ist kaum lesbar.

auch folgender Code hilft hier nicht beim Zählen der integer "zahl" Größe:

Code: Alles auswählen

int j=0;
for (i=0;i<zahl; i*10)
{
    j++
}
Kann mir Jemand kurz schreiben, warum die Größe des Integers nicht richtig ausgegeben wird?
Sehe ich mal wieder den Fehler vor lauter Fehlern nicht :-)
Vielen Dank!

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » So Mai 11, 2014 10:23 pm

Hallo zusammen,

ich habe einmal über das ganze nachgedacht und stelle fest, hier und da habe ich eigentlich in einigen Funktionen mehr als einen Step zu viel eingebaut.
Ich werde die Funktion hexascii2int umbauen nach hexascii2ascii, damit erspar ich mir hoffentlich, so mein Gedankengang, die Nutzung eines zusätzlichen Int variablen.
Ich werde mal sehen, ob das funktioniert.

Ich kann verstehen, wenn es allmählich nervig wird hierauf zu antworten, da man selber kaum noch durchsteigt, wo ich hin will.

Viele Grüße.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Mo Mai 12, 2014 6:59 am

chris_1981_ hat geschrieben:...da man selber kaum noch durchsteigt, wo ich hin will.
So isses.

Ganz am Anfang glaube ich mal verstanden zu haben, was Du eigentlich machen willst. Mittlerweile bin ich mir da nicht mehr so sicher...

Du scheinst gerade ausrechnen zu wollen, wie viele Stellen ein int in Dezimaldarstellung (Basis 10) benötigt. Wozu?

Wenn's einem nix ausmacht, daß das etwas ineffizient ist, kann man das in zwei (ein bißchen schöner in ein paar mehr) Zeilen machen:

Code: Alles auswählen

int num_digits(int num)
{
    char intstr[16];
    
    itoa(num, intstr, 10);
    return strlen(intstr);
}

Das funktioniert - ohne daß man groß was ändern muß - auch für eine beliebige Basis (z.B. 16 ;) ):

Code: Alles auswählen

int num_digits(int num, int base)
{
    char intstr[16];
    
    itoa(num, intstr, base);
    return strlen(intstr);
}

It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Mo Mai 12, 2014 8:21 am

Oder Mathematisch:
Die Anzahl der Stellen entspricht dem abgerundeten Wert des Logarithmus zur Basis n +1:

Code: Alles auswählen

Anzahl Stellen = log_n(x) + 1
Redundanz macht wiederholen unnötig.
quod erat expectandum

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Mo Mai 12, 2014 6:36 pm

hallo zusammen,

ja, vielleicht sollte ich den Thread löschen bzw. schließen.
Ich habe aktuell das Problem noch, das ich ja ein Hex Array in Ascii Format vom Handy zurück bekomme
4B76BA1D06E
dieses Array muss ich ja passend in ein char array umwandeln, damit ich hieraus wieder einen Text lesen kann.
Also HexArray = 4B76BA1D06E -> nach PDUString -> Ascii Text.
Es funktioniert aktuell schon, nur habe ich ja von mfro die Funktion direkt übernommen, womit ich das HexArray übergebe und die Int Werte der einzelnen Stellen wiederbekomme, danach gehe ich hin und führe die einzelnen Stellen zusammen zu einem Char Array:

mit folgendem Code:

Code: Alles auswählen

void hexAscii2Int( char *string, unsigned char *newString )
{
    while(*string)
    {
        switch (*string)
        {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            *newString = *string - '0';
            // man könnte hier natürlich auch "c - 40;" schreiben, aber so sieht man, was gemeint ist
            break;

            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            *newString = (10 + *string) - 'A';
            // man könnte hier natürlich auch "10 + c - 65;" schreiben, aber so sieht man, was gemeint ist
            break;

            default:
            fprintf(stderr, "%c ist keine Hex-Ziffer \n", *string);
            //exit(1);
            *newString = '0';
        }
        printf ("Int: %i  Hex: %02x \n", *newString, *newString);
        *string++;
        *newString++;
    }
                            <<<<----- Setze ich hier ein *newString = '\0'; ein funktioniert der Code auch ohne Zusammenführung der beiden Funktionen.
}

// Now we bring two integers together to one.
void twoint2one (unsigned int *zahl, unsigned char *septs)
{
    int i = 0;

    for (i=0;i<20;i++)      <<<<---- hier passt die Funktion nicht, ich will ja nur wissen wie groß zahl gefüllt ist um nicht müll mit zunehmen.
    {                                         
        *septs = *zahl++ << 4;
        *septs |= *zahl;
        //printf ("Int: %i  Hex: %02x \n", *septs, *septs);
        *septs++;
        *zahl++;
    }
    *septs = '\0';
}
Das geschulte Auge sieht sofort man kann beide Funktionen zusammenführen, bzw. auch anders bauen, damit spare ich mir auch einen Integer von der Größe 160 stellen.
Ich muss ja sparen, das ganze soll ja mal auf einen µController.

Konntet ihr mir folgen??

@mfro und cloidnerux
Wäre es von Interesse diese Thema natürlich neu geschrieben ins Wiki zu packen?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Umwandlung von 8bit zu 7bit

Beitrag von cloidnerux » Mo Mai 12, 2014 8:05 pm

Wäre es von Interesse diese Thema natürlich neu geschrieben ins Wiki zu packen?
Auf jeden Fall!
ja, vielleicht sollte ich den Thread löschen bzw. schließen.
Musst du nicht, hier solltest du aber vlt nur noch generelle Sachen zur Diskussion stellen.
Konntet ihr mir folgen??
Nicht wirklich.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten