byte array to string

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

forum.cpp (1.04 KB)

itoa?

itoa?

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

Werde ich heute Abend mal testen.

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?

#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!");
  }
}

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

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...

Geht auch komplett per Hand:

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

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

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