Byte Wert in String umwandeln

Hallo,
ich habe ein Problem. Ich möchte einen Byte-Wert aus einem Array in einen String umwandeln, damit ich diesen mithilfe von Slicing o.Ä. verändern.

byte liste[8]={B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111};

Mithilfe einer for-Schleife würde ich dann string = "B111111111"; erhalten wollen. Wie könnte man das umsetzen?

1 Like

und welchem Zeichensatz möchtest du da zu grunde legen um aus einem Byte B111111111 genau welches Zeichen zu machen?

1 Like

Wie meinst du? Habe die frage nicht ganz verstanden :slight_smile:

Welchen Sinn das hat?
B111111111 ist was proprietäres und überflüssiges

Ich versuche ein Matrix modul anzusteuern und muss diese Werte abändern.

Ich versuche ein Matrix modul anzusteuern und muss diese Werte abändern.

Nein!
Du fängst am falschen Ende an..

Wie soll ichs sonst umsetzten :face_with_monocle:

Egal....
Es gibt einige Möglichkeiten.

Es gibt keinen(?) Grund eine solch irrationale Zahlendarstellung zu nutzen.

Gibt es bessere Ideen byte liste[8]={B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111}; als so das Modul anzusteuern

Hallo,

die Binäre Form ist nur ein anderes Zahlensystem. Nur eine andere Darstellungsform.
B1111111 = 255 dezimal.
Damit kannst du ganz normal rechnen oder sonstwas machen.
liste[0] - 1 = 254
Was möchtest du denn an der Zahl ändern?
Um welches Modul handelt es sich denn überhaupt?

Ja das weiß ich. Ich würde es lieber lösen wie in Python, also mit so etwas wie str()

#include <LedControl.h>

Ich gebe auf...

Ja dann lass es und sei ruhig

Hallo,
so ganz hab ich noch nicht begriffen was Du vorhast und was der Sinn sein könnte. Allerdings könnte ich mir vorstellen das Dich bitRead(x, n)

eventuell weiter bringt
schau mal hier

Mit sowas könnte man in einer Schleife die einzelnen Bits abfragen und dann eine Zeichenkette aus 0 oder 1 zusammesetzen.

Heinz

1 Like

bitte beschreibe was du genau vor hast.

Weiters 3 Fragen für dich:

Woher kommen die Werte ?

B11111111

Wie sollen diese nach deiner Änderung aussehen?

Was soll mit den neuen Werten dann passieren?

TestProgramm:

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"


void setup() 
{
  Serial.begin(9600);
  cout << F("Start")    << endl;
  cout << F("dezimal ")       <<      B11111111  << endl;
  cout << F("hexadezimal 0x") << _HEX(B11111111) << endl;
  cout << F("oktal 0")        << _OCT(B11111111) << endl;
  cout << F("binär 0b")       << _BIN(B11111111) << endl;
  
}

void loop() 
{

}

Ausgabe:

Start
dezimal 255
hexadezimal 0xFF
oktal 0377
binär 0b11111111

Umsetzen könnte man das wie folgt

constexpr byte MAX_LIST_INDEX {8};
constexpr byte MAX_BUFFER_SIZE{10}; // 8 Bitzeichen + 2 Wegen "B" uns String Ende Zeichen '\0'
 
void setup() {
  Serial.begin(115200);
  byte liste[MAX_LIST_INDEX]={B11111101,B11111001,B11111111,B11111111,B11111111,B11111111,B11111111,B11};
  char buffer[MAX_BUFFER_SIZE];
 
  for (auto element : liste) {
    byteToCharArray(element, buffer, MAX_BUFFER_SIZE);
    Serial.println(buffer);
  }
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
 
void byteToCharArray(byte value, char* buf, byte max_buf_size) {
  byte idx=max_buf_size;
  buf[0] = 'B';
  buf[--idx] = '\0';
  for (byte i = 0; i < 8; ++i) {
    buf[--idx] = ((value >> i) & 0x01) ? '1' : '0';
  }
}

Ob es Sinn macht, muss noch geklärt werden.

1 Like

Bin nicht böse :slightly_smiling_face:

buf[--idx] = '0' + ((value >> i) & 0x01);

geht natürlich auch… ist schicker…

Wahrscheinlich wäre es auch noch besser, statt der 8 in der for Anweisung ein max_buf_size-2 reinzuschreiben. Usw.

Ja, besser geht fast immer, irgendwie.
Zur Not muss man eben den Begriff "besser" je nach Situation neu auslegen.

Ich persönlich halte B11111111 für ein total krankes Datenformat.
Es mag mal (halbwegs) sinnvoll gewesen sein, als C++ noch kein 0b11111111 konnte.
Aber heutzutage?

Die B11111111 sind Defines in der Arduino Welt.
Damit Per Se schon bedenklich.
Kaum ein Anderer tut das so.

Des Menschen Wille ist sein Himmelreich. Wenn der TO es so möchte, habe ich halt einen Lösungsvorschlag unterbreitet.

Er wird schon merken ob es weiter hilft, oder ob das ein Holzweg ist.
Dennoch sind die Hinweise hier im Thread ja berechtigt. Evtl. regen die ja zum weiteren Nachdenken an….

Könnte ja sein.