Hallo Wolfgang,
für "string" mit anderen Basen als 10 nach "unsigned long int" benötigst
Du "strtoul(..)". Ob "unsigned long int" identisch mit uint64_t ist,
hängt vom Compiler ab.
Gruß
Fred
Hi Fred,
danke für erste Info.
AVR-GCC: typedef unsigned long long int uint64_t
Ich hätte vielleicht mein Problem noch ein wenig genauer beschreiben
sollen:
Ich verwende WinAVR und einen atmega128 und möchte eine Zeichenkette die
ich über UART empfange in eine 'echte' Zahl umwandeln. Die Zeichenkette
ist dabei max. 14 'Hex-Zeichen' lang. Dabei entspricht das erste Zeichen
dem höchstwertigen Nibbel in der Zahl, das letzte Zeichen, dem
niederwertigsten Nibbel, die uint64_t muß also (nachdem alle Zeichen
empfangen worden sind) von rechts her aufgebaut werden.
Wolfgang
Wolfgang Birner wrote:
> ist dabei max. 14 'Hex-Zeichen' lang. Dabei entspricht das erste Zeichen> dem höchstwertigen Nibbel in der Zahl, das letzte Zeichen, dem> niederwertigsten Nibbel, die uint64_t muß also (nachdem alle Zeichen> empfangen worden sind) von rechts her aufgebaut werden.
Das kannst du on-the-fly zusammenbauen.
Frei nach dem Muster
Result = 0
while( nächstes Zeichen gehört zur Hex Zahl ) {
Result = Result * 16 + HexDigit( nächstes Zeichen )
}
Getreu dem (Dezimal)Muster
1287 = 1 * 1000 + 2 * 100 + 8 * 10 + 7 * 1 =
(((( 1 * 10 ) + 2 ) * 10 ) + 8 * 10 ) + 7
Mit der Hilfsfunktion: HexDigit
1
intHexDigit(charDigit)
2
{
3
if(Digit>='0'&&Digit<='9')
4
returnDigit-'0';
5
6
returnDigit-'A'+10;
7
}
Das hat den Vorteil, dass du theoretisch die Character
gar nicht zwischenspeichern musst, sondern die Zahl aufbauen
kannst während die Ziffern über die UART eintrudeln.
Aufpassen auf die Datentypen!
Hallo Wolfgang,
> AVR-GCC: typedef unsigned long long int uint64_t
also wird es nicht gehen, da "typedef long int uint32_t"! Ausweg: Du
wandelst zuerst die unteren 8 Zeichen um (gibt Dir die unteren 4 Bytes),
dann die oberen (gibt Dir die oberen 4) und fügst alles zusammen.
> niederwertigsten Nibbel, die uint64_t muß also (nachdem alle Zeichen> empfangen worden sind) von rechts her aufgebaut werden.
Sowohl atoi() als auch strtoul() machen es so!
Wenn Du nur mit 16 als Basis arbeitest, ist doch eine Ziffer immer ein
Nibble. Du kannst also leicht selbst eine Funktion schreiben, die den
String zeichenweise umwandelt und die Ergebnisse Byte-weise in eine
Union mit Deiner uint64_t Variablen schreibt!
Gruß
Fred
P.S. Karl-Heinz war schneller - hätte ich mal nicht zwischendurch
telefoniert!
Danke für den Hinweiß, mach mal sieht man den Wald vor Bäumen nicht.
Ich habs jetzt mal mit einer anderen ID ausprobiert (04055859EE0281) da
steht jetzt in rfid.ll = 0x9EE027DF55556A47, was immer noch nicht
0x0004055859EE0281 ist.
Danke nochmal.
Ich hab gerade eine Möglichkeit gefunden meinen RFID-Reader binär
auszulesen, jetzt werde ich halt mal versuchen, das zu realisieren. Die
Sache mit der Umrechnung bekomme ich nicht gebacken.
Wolfgang
Hallo Wolfgang,
zwei Anmerkungen:
1. Ich glaube, der Fehler liegt irgendwie in der Art und Weise, wie Du
rfid.ll anzeigst, nicht im obigen Code (nach Entfernen des ';').
2. Deine fast klammerlose Zeile rfid.ll=.... ist korrekt. Gerade beim
Konstrukt "bedingung?a:b" gibt es aber Unterschiede zwischen
verschiedenen Compilern (C vs. C++; ich bin diesbezüglich mal gewaltig
reingefallen!) -- deshalb setze ich gerne Klammern (gibt ja keinen extra
Code, macht die Sache aber übersichtlicher).
Gruß
Fred