Go Down

Topic: byte array to string (Read 198 times) previous topic - next topic

joker2048

Hi ihr alle,

ich verzweifele gerade, da ich trotz zahlreicher Treffer in diesem Forum und auch in andere Foren zu c/c++ fündig geworden bin, mein Ansatz aber überhaupt nicht funktioniert. Ich gehe davon aus, dass ich einfach zu blöde bin...

Ich möchte gerne ein byte array zu einem string konvertieren. Bestenfalls die Zahlen im Hex Format.

Ich habe schon alles mögliche zu char, char*, und co gefunden aber irgendwie kompiliert der entweder nicht oder die Ergebnisse sind Zeichensalat.

Ich bekomme die Zeichen sauber auf der seriellen Schnittstelle ausgegeben, aber wenn ich die weiterverwenden will (z.B. als String) scheitere ich.

Fachlich geht es um das einlesen von OneWire iButtons auf einem NodeMCU...

Aber ich glaube ich habe hier eine einfache und dämliche c/c++ Frage. So weit weg kann ich gar nicht sein, weil ich "einfach nur" integer in Zeichen umwandeln muss. Glaube ich.

Vielleicht kann mir jemand hier helfen...

Danke,
Christian

ardubu


joker2048

itoa?


Hm irgendwie nirgendwo gefunden, sieht ja nach genau dem aus, was ich suche  :smiley-confuse:  :smiley-confuse:  :smiley-confuse: Manchmal sieht man den Wald vor lauter Bäumen nicht. Danke.

Werde ich heute Abend mal testen.

joker2048

Ich komme trotzdem nicht klar...

Wie bekomme ich den String (oder char oder was) denn zusammengesetzt. Ich möchte gerne am Ende eine HEX Repräsentation meiner Adresse haben. Der Serial Print in der for Schleife macht es richtig, ich will es nur in eine Variable haben um damit nachher per mqtt arbeiten zu können (Siehe oberes Array, für später) Kann mir jemand in diesen C Grundlagen aushelfen?

Code: [Select]

#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <sstream>
#include <iostream>
#include <iomanip>
//#include <PubSubClient.h>
#include <map>
using namespace std;

// 1Wire Settings
OneWire ibutton (D4); // I button connected on PIN 2.
std::map<char*, char*> keys{
  {"34 EE 19 0 0 11", "black"},
  {"14 EC 1A 3 4 23", "blue"},
  {"23 67 17 0 0 2a", "purple"},
  {"C9 A8 19 0 0 45", "red"}
};
// Misc.
byte buffer[8];
// typedef uint8_t byte;

boolean result;  // this variable will hold the compare result

void setup(){
  Serial.begin(115200);
}

void loop(){
  // Search for an iButton and assign the value to the buffer if found.
  if (!ibutton.search (buffer)){
     ibutton.reset_search();
     delay(250);
     return;
  }
  // At this point an iButton is found
  Serial.println("1-Wire Device Detected, ID is:");
  string currentButton = "";
  string myButton = "";

  for (int x = 0; x<8; x++){
    Serial.print(buffer[x],HEX);
    itoa(buffer[x], myButton, 16);

// Irgendwas wie currentButton += myButton

    Serial.println(" ");
  }
Serial.println(currentButton);

  if ( ibutton.crc8( buffer, 7) != buffer[7]) {
      Serial.println("CRC is not valid!");
  }
}



Tommy56

Du kannst bei itoa eine Basis - für Hex 16 mitgeben. Falls das "0x" davor gebraucht wird, musst Du das selbst einfügen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

joker2048

Die Basis 16 habe ich schon. Bekomme nur den verflixten String nich zusammengesetzt. Oder was sollte ich nehmen?

char?
string?
String?
stringstream?

Was kann ich nachher besser benutzen (für das Array oben)
bzw. für den Serial.print.

Sry komme aus der Java/PHP/Python-Welt und komme mit den einfachsten C Zeichenketten nicht klar...

Serenifly

#6
Mar 26, 2019, 12:57 am Last Edit: Mar 26, 2019, 01:02 am by Serenifly
Geht auch komplett per Hand:

Code: [Select]


void setup()
{
  Serial.begin(9600);

  byte data1[] = { 0x5, 0x10, 0x20, 0xAA, 0xBB, 0xCD, 0xEF };
  byte data2[] = { 1, 2, 3, 4, 5, 6, 0x0A, 0xFF };
  byte data3[] = { 9, 0xA5, 0xB8, 0xF8, 0x4C, 7, 0xDA };

  byteToHexString(data1, sizeof(data1));
  byteToHexString(data2, sizeof(data2));
  byteToHexString(data3, sizeof(data3));
}

void loop()
{
}

void byteToHexString(byte* data,  byte length)
{
  char str[length * 2 + 1];
  str[length * 2] = '\0';
  byte digit;

  for (int i = 0; i < length; i++)
  {
    digit = data[i] / 16;
    str[i * 2] = getHexDigit(digit);
    digit = data[i] % 16;
    str[i * 2 + 1] = getHexDigit(digit);
  }

  Serial.println(str);
}

char getHexDigit(byte digit)
{
  char c;
  if (digit >= 0 && digit <= 9)
    c = digit + '0';
  else if (digit >= 0xA && digit <= 0xF)
    c = digit + 'A' - 10;
  else
    c = '0';

  return c;
}


Jede Hex Zahl mit führenden Nullen. Das macht es einfacher und auch besser lesbar

ElEspanol

Wenn du es seriell korrekt ausgeben kannst, kannst du auch einfach in eine Variable (char array) printen oder streamen. Such mal nach PString lib

Serenifly

Weder itoa() noch print(..., HEX) macht aber führende Nullen. Das müsste man immer noch per Hand erledigen

Go Up