Hilfe: Byte Array in char* bzw. ByteArray als int32 umrechnen

Hallo,

ich stehe leider irgendwie aufm Schlauch und komm einfach nicht weiter. So nun zu meinem Problem:

Ich habe ein ByteArray mit ganz vilen Zeichen bei dem dann diese 4 als INT16 gerne auslesen würde. So könnte z.B. der Teil aussehen (das gesamte byte Array ist 56 Stellen lang).

 byte input_byte[4] = {0x90, 0x38, 0x00, 0x00};

Davon würde ich gerne den Dezimalwert berechnen (14480).
Ich habe folgende Funktion gefunden:

const char *hexstring = "00003890";
int number = (int)strtol(hexstring, NULL, 16);

Die mach genau das was ich suche, allerdings verzweifel ich dabei die HEX-Wert, also “00003890” in ein String bzw. char* zu packen. Alles was ich versucht hatte rechnete immer sofort in dezimal um ;-(

Kann mir einer helfen?

Grüße, Andy

Ein einfacher cast sollte da genügen.

Hier beispielhaft für den Wert der bei input_byte[0] anfängt:

byte input_byte[4] = {0x90, 0x38, 0x00, 0x00};

void setup() {
  Serial.begin(115200);
  Serial.print(F("als long "));
  Serial.println(*((long*)&input_byte[0]));
  Serial.print(F("als int "));
  Serial.println(*((int*)&input_byte[0]));
}

void loop() {}
als long 14480
als int 14480

Hallo,

danke fürs schnelle Antworten. So ganz verstehen tu ich es aber nicht.

byte input_byte[4] = {0x90, 0x39, 0x00, 0x00}; 

void setup() {
  Serial.begin(9600);
  Serial.println(*((int*)&input_byte[0]));
}

void loop() {
}

Ergebnis: 14736, alles i.O.

byte input_byte[4] = {0x90, 0x39, 0x01, 0x00}; 

void setup() {
  Serial.begin(9600);
  Serial.println(*((int*)&input_byte[0]));
}

void loop() {
}

Ergebnis: 14736 (0x90, 0x39, 0x*01*, 0x00)

Jetzt müsste doch der Dezimalwert 80272 sein oder? In der definition des Protokolls steht int32 und es werden die oben genannten Daten (nur ein Auszug aus dem ganzen ByteArray) gesendet.

Dann noch die Frage, wie bekomme ich den gecastetet int* in einen echten int? Ich möchte mit den Werten Weiter als int arbeiten.

Danke und Grüße, Andy

In einen int passen nur zwei Bytes, nimm long für 4.

byte input_byte[4] = {0x90, 0x39, 0x01, 0x00};
void setup() {
  Serial.begin(115200);
  Serial.print(F("als long "));
  Serial.println(*((long*)&input_byte[0]));
  Serial.print(F("als int "));
  Serial.println(*((int*)&input_byte[0]));
}
void loop() {}
als long 80272
als int 14736

Denkfehler gefunden...mit einem long geht es natürlich. Jetzt muss ich nur nochmal googlen, wie ich den gecasteten long* in ein "normalen" long bekomme. Oder hast du hierfür auch gleich noch ein Rezept ;)

Danke für deine Hilfe !!!!! :wink:

Du hast den * davor vergessen.

* ((long*) &input_byte[0])

Bedeutet

  • nimm die Adresse des ersten Zeichens des Puffers
  • interpretiere diese Adresse als Adresse eines long
  • hole den Wert von dieser Adresse (einen long Wert)

? Da kommt bei mir aber ein Fehler:

byte input_byte[4] = {0x90, 0x39, 0x01, 0x00}; 

void setup() {
  long long_typ;
  Serial.begin(9600);
  long_typ = (long*)&input_byte[0];
  Serial.println(*((long*)&input_byte[0]));
}

Fehler:

test_dec:6: error: invalid conversion from 'long int*' to 'long int' [-fpermissive]

   long_typ = (long*)&input_byte[0];

Jetzt ist mir die Antwort in die Nachricht davor geraten, sorry.

War gerade dabei via Modify noch Ergänzungen anzumerken.

long long_typ = (long*)&input_byte[0];

Einen Zeiger auf long kannst du natürlich nicht ohne Dereferenzierung an einen long zuweisen. Da meckert der Compiler völlig zurecht