PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Zeichen aus String entfernen (Keil, XE164)



Jaecko
11.03.2008, 17:23
Moin.

Bin gerade dabei, mit einem XE164 (Infineon) anzufangen. Als Compiler wird Keil mit C verwendet. Problem an der Sache ist nun, dass ich Registern Werte nur als Dezimalzahl oder per hex angeben kann; eine Angabe im Stil von x = &b00110100 geht nicht.
Ich habe darum eine function gebaut, die es über
x = bin2dec("00110100") doch ermöglicht (s.u.).

Da es bei 16-Bit-Zahlen aber leicht unübersichtlich wird, wollte ich es so machen, dass man in dem Bit-String Punkte als Trennzeichen einfügen kann:
x = bin2dec("0001.1001.0010.1001")

Nur scheiterts da nun am Entsorgen der Punkte.
Bisherige Suchen über Google etc brachten keine Ergebnisse, da die Beispiele (z.B. strtok) nicht funktionieren.

Hat hier jemand ne Idee dazu?

MfG

Bisheriger Code:


int bin2dec(char *bin)
// Converts a binary string into a decimal value
// e.g. to set control registers directly via single bits
{ int b, k, m, n;
int len, sum = 0;
len = strlen(bin) - 1; // determine length of binary value
for(k = 0; k <= len; k++)
{
n = (bin[k] - '0'); // char to numeric conversion
if ((n > 1) || (n < 0)) // If Bit neither 1 nor 0
{return (0);} // quit function and return 0
for(b = 1, m = len; m > k; m--)
{ b *= 2; } // 1 2 4 8 16 32 64 ... place-values, reversed here
sum = sum + n * b; // add all results
} return(sum); // return decimal value
}

PicNick
11.03.2008, 20:07
Mach das doch direkt:


int Ziel = 0;
char Inp[32] = "0001.0010.0100.1000";


int iX;
for (iX = 0; iX < strlen(Inp); iX++)
{
if (Inp[iX] != '.')
{
Ziel <<= 1; // ein links
Ziel |= (Inp[iX] & 1); // Null oder Eins
}
}


Ich hoffe, verständlich. Man müßt noch ev. checken, ob wirklich nur Nullen und Einsen im String sind etc.

Remark:
Ziel != (Inp[iX] & 1); // Null oder Eins
beruht darauf, das der Ascii-Code von "0/1" = 0x30 / 0x31 ist, d.h. ich kann das low Bit direkt übernehmen

Jaecko
12.03.2008, 08:35
Perfekt, läuft so. Thx.
Und ist natürlich auch kürzer als mein bisheriger Ansatz.

fumir
12.03.2008, 13:07
wie wärs mit:


#define .oooo 0
#define .oooI 1 // kleinbuchstabe o, grossbuchstabe I
#define .ooIo 2
...
#define .IIIo E
#define .IIII F

...

int binaer=0x.oooI.ooIo.IoIo.IIoo


habs nicht ausprobiert, und defines sollte man eigentlich nach möglichkeit vermeiden.
und natürlich sollte man tunlichst vermeiden die .bbbb kombinationen irgendwo anders (versehentlich) zu verwenden !!! :-)
hat aber den vorteil, das keine funktion aufgerufen werden muss (was nicht an jeder stelle geht)