Offline
Newbie
Karma: 0
Posts: 28
|
 |
« on: August 12, 2011, 05:53:00 am » |
Hi, der Titel sagt eigentlich schon Alles. Ich hab ein String-Objekt mit Inhalt im hexadezimalen Format, der zum Beispiel das hier enthält: 3C00CCA7F6
Wie kann ich das denn jetzt in einen dezimalen Integer konvertieren? Viele Grüße Werni
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #1 on: August 12, 2011, 05:58:31 am » |
3C00CCA7F6
Das sind 5 Bytes, das ist selbst für einen unsigned long zuviel... Was willst Du damit machen? Kann man das aufsplitten?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #2 on: August 12, 2011, 06:05:39 am » |
Ich weiß nicht ob man das aufteilen kann. Die Daten repräsentieren die Nummer eines RFID-Tags in HEX Form und jetzt will ich sie in die Nummer umwandeln, die draufsteht.
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #3 on: August 12, 2011, 06:08:20 am » |
Die Daten repräsentieren die Nummer eines RFID-Tags in HEX Form und jetzt will ich sie in die Nummer umwandeln, die draufsteht.
Zum Vergleichen obs der erwartete Tag ist oder was hast Du vor? Falls dem so ist wäre ein String-Vergleich vermutlich einfacher und effektiver...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #4 on: August 12, 2011, 06:13:15 am » |
Ja, einfach um zu schauen ob es der Tag ist. Ich hab hier mal einen Ausschnitt der sagt, wie man das machen soll. Ich komme aber damit nicht ganz zurecht. Example Card number: 62E3086CED Checksum:( 62H)XOR(E3H)XOR(08H)XOR(6CH)XOR(EDH)=08H Note: The 10 ASCII characters grouped as 5 hex data needs to be further processed as you may find that the 5 hex data is not equal to the number marked on the tags in Decimal. Actually the tag number is equal to the later 4 bytes in decimal. For example, the card number is 62E3086CED, the corresponding number marked on the tag should be 60717296877 which is the Decimal format of E3086CED. Start- und end-flag, sowie die Prüfsumme sind bereits aus dem String raus. Mal nebenbei, wie kann ich denn die Prüfsumme berechenen? Mh, jetzt seh ich auch man hätte das erste Byte weglassen können -.- Geht es denn jetzt?
|
|
|
|
« Last Edit: August 12, 2011, 06:29:04 am by Werni »
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #5 on: August 12, 2011, 06:32:59 am » |
Per XOR, nach dem was da steht.  Beim Arduino macht das der "^"-Operator.
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #6 on: August 12, 2011, 06:39:02 am » |
Mh, jetzt seh ich auch man hätte das erste Byte weglassen können -.- Geht es denn jetzt?
Ja, dann gehts. Irgendwas in der Art: char in[] = "00CCA7F6"; int out = 0; for (byte t=0; t<8; t++) { if (in[t]>='0' && in[t]<='9') in[t] -= '0'; if (in[t]>='A' && in[t]<='F') in[t] -= 'A'-10; out = out*10 + in[t]; }
Ungetestet, also ohne Gewähr!  Das basiert auf dem ASCII-Alphabet und den Positionen der Buchstaben darin.
|
|
|
|
« Last Edit: August 12, 2011, 07:31:23 am by Joghurt »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #7 on: August 12, 2011, 06:42:45 am » |
Per XOR, nach dem was da steht. Oh Man, das war einfach 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #8 on: August 12, 2011, 07:48:14 am » |
Hi Joghurt, es funktioniert leider nicht.
Heraus kommt 20136. Es sollte aber 13412342 sein
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #9 on: August 12, 2011, 07:52:23 am » |
Wie gesagt hab ichs nicht getestet, geht hier in der Firma nicht, Du wirst es wohl debuggen müssen.  Guck Dir mal Serial.begin und Serial.println and, damit kannst Du Dir Werte auf die Konsole ausgeben lassen. Damit solltest Du rausbekommen können wos hakt.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #10 on: August 12, 2011, 08:08:04 am » |
Mach ich schon die ganze Zeit void setup(){ Serial.begin(9600); char in[] = "00CCA7F6"; int out = 0; for (byte t=0; t<8; t++) { if (in[t]>='0' && in[t]<='9') in[t] -= '0'; if (in[t]>='A' && in[t]<='F') in[t] -= 'A'-10; out = out*10 + in[t]; } Serial.println(out); } Ich weiß nicht genau wo ich da debuggen soll. Für mich erscheint der Code komplett richtig.
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #11 on: August 12, 2011, 08:23:16 am » |
Ach, ich doof!  Mach statt out = out*10 + in[t]; out = out*16 + in[t]; und out sollte zur sicherheit eine unsigned int sein...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #12 on: August 12, 2011, 08:33:11 am » |
Hi Joghurt, das hatte ich schon ausprobiert. Es funktioniert nicht. Da kommt 42998 raus.
ist *10 nicht eigentlich richtig, damit die neue Zahl einfach um eins nach rechts verschoben wird?
|
|
|
|
« Last Edit: August 12, 2011, 08:34:52 am by Werni »
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #13 on: August 12, 2011, 08:38:47 am » |
ist *10 nicht eigentlich richtig, damit die neue Zahl einfach um eins nach rechts verschoben wird?
Nein, weil in jedem Hex-Zeichen ja die Information von vier Bit, also 16, steht.  Probier mal zwecks debugging folgendes: void setup(){ Serial.begin(9600); char in[] = "00CCA7F6"; unsigned int out = 0; for (byte t=0; t<8; t++) { if (in[t]>='0' && in[t]<='9') { Serial.println(in[t]); in[t] -= '0'; Serial.println(in[t], DEC); } if (in[t]>='A' && in[t]<='F') { Serial.println(in[t]); in[t] -= 'A'-10; Serial.println(in[t], DEC); } Serial.println(out); out = out*10 + in[t]; } Serial.println(out); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 28
|
 |
« Reply #14 on: August 12, 2011, 08:57:29 am » |
So ähnlich hatte ich das schon gemacht: void setup(){ Serial.begin(9600); char in[] = "00CCA7F6"; unsigned int out = 0; for (byte t=0; t<8; t++) { Serial.print(in[t]); Serial.print(": "); if (in[t]>='0' && in[t]<='9') in[t] -= '0'; if (in[t]>='A' && in[t]<='F') in[t] -= 'A'-10; int j=0; if (in[t] >= 10) j=1; //for (j; j<t+1; j++){ // Serial.print(" "); //} Serial.print(in[t], DEC); Serial.print(" "); if (in[t]<10) Serial.print(" "); Serial.println(out); //Serial.print("neu:"); //Serial.println(out); out = out*16 + in[t]; } Serial.println(out); }
0: 0 0 0: 0 0 C: 12 0 C: 12 12 A: 10 204 7: 7 3274 F: 15 52391 6: 6 51839 42998
Komisch, dass der Wert am Ende kleiner wird
|
|
|
|
|
Logged
|
|
|
|
|
|