Go Down

Topic: Hex to Long ich dreh durch (Read 1 time) previous topic - next topic

Frankthetank23

Heyho folgendes,
Hab einen String der eine Hex-Zahl enthält.
Code: [Select]
String zahl = String("0xF8");
Den muss ich in meine Variable reinbekommen, ich weiß aber nicht wie.
toInt(); funktioniert nicht, da bekomm ich 0 raus, möchte aber eigentlich 0xF8 da drin stehen haben.
Heeeelp!

Whandall

#1
Jul 07, 2016, 08:42 pm Last Edit: Jul 07, 2016, 08:49 pm by Whandall
Code: [Select]
const char source[] = "0xabcdef!";

void setup() {
  Serial.begin(115200);
  char* behind;

  unsigned long result = strtoul(source, &behind, 16);

  Serial.print(F("result 0x"));
  Serial.print(result, HEX);
  if (behind) {
    Serial.print(F(", text after parsed: '"));
    Serial.print(behind);
    Serial.write('\'');
  }
  Serial.println();
}
void loop() {}
Code: [Select]
result 0xABCDEF, text after parsed: '!'

Edit: Funktioniert auch mit 0x Prefix.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Serenifly

Die Arduino Software hat nur eine eingeschränkte Funktionalität. Vor allem bei der Formatierung und Konvertierung von Strings mangelt es gewaltig. Dir steht aber die avr libc und damit sehr viele Standard C Funktionen zur Verfügung.

Frankthetank23

Genau an diesem 0x hakt es bei mir. Meine long-Variable sollte nämlich nachher den Inhalt 0xF8 haben.

Whandall

Long Variablen haben kein 0x.

Ihre hexadezimale Darstellung kann ein 0x haben.

strtoul() kann auch Prefixe lesen und honorieren, 3. Parameter ist dann 0, bei 16 nimmt die Funktion nur hexadezimale Zahlen (mit oder ohne 0x davor).
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Serenifly

Doku dazu:
http://www.cplusplus.com/reference/cstdlib/strtol/

Das ist strtol() (also die Version mit Vorzeichen), aber die Beschreibung da ist ausführlicher als für strtoul().

Als zweiten Parameter kann man auch einfach NULL nehmen, da der Text dahinter in dem Fall egal ist

Frankthetank23

#6
Jul 07, 2016, 09:32 pm Last Edit: Jul 07, 2016, 09:37 pm by Frankthetank23
Okay dann versuch ich dir mein ganzes Problem zu erklären. Will per Infrarot Daten senden.
Methode hierfür ist
Code: [Select]

long l = 0xF7;
irsend.sendSony(l, 12);

 Parameter ist unsigned long. Wenn ich jetzt aber nur F7 reinschreib geht es nicht und ich bekomm einen Error.
Code: [Select]
long l = F7;
Funktioniert nicht.

Bin Anfänger also bitte nicht töten :D

Whandall

#7
Jul 07, 2016, 09:35 pm Last Edit: Jul 07, 2016, 09:36 pm by Whandall
Weil F7 nicht definiert ist.

Ohne das 0x kann der Kompiler das nicht als Zahlenkonstante erkennen und hält es für einen Namen.

Und was hat das mit deiner Eingangsfrage zu tun?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Frankthetank23

Mein Problem war, wie der Inhalt meines Strings später exakt in meiner long-Variable drin steht.

Whandall

#9
Jul 07, 2016, 09:48 pm Last Edit: Jul 07, 2016, 09:53 pm by Whandall Reason: umformuliert
Du verstehst es glaube ich immer noch nicht.

Ein long ist ein Speicherbereich von 4 Bytes, in denen jeweils Bits sind,
der niederwertigste Teil der gesamten Zahl steht im ersten Byte. (Alles für normale Arduinos).

singned/unsigned sind Interpretationen des Inhalts (gibt es negative Zahlen, oder nicht) ,
dezimal, hexadezimal, oktal, binär sind alles nur Darstellungen, also textuelle Abbilder des Inhalts.

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Frankthetank23

Mir ist grade alles klar geworden. Sorry dass ich deine Zeit verschwendet habe. Tut mir echt Leid. Trotzdem Danke für die mühsame Hilfe. Hab den ganzen Abend dran rumgerätselt obwohl es so einfach ist. Peinlich. Kann man hier irgendwo Daumen hoch geben oder soetwas?
#immerdieanfänger

Whandall

Wichtig ist es das Konzept zu verstehen.  ;)
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

michael_x

Quote
Kann man hier irgendwo Daumen hoch geben oder soetwas?
#immerdieanfänger
Das wird hier mit Karma gemacht ;)

Go Up