String Zählen Bis zum "=" Nicht .Lenght()

Hallo ich habe folgendes Problem.

Ich versuche grade eine Funktion aufzubauen, der mir aus dem String 1 Minus String 2 die End länge übergeben soll.
Zum besseren Verständnisse.

String String1 = "/Settings/ Plain: Sliderrgb1Ranges=1";
String String2 = "Sliderrgb1Ranges=";

int Stinglaengebiszumkommer = String1.lenght() - String2.indexOf("=")??? :sweat_smile:
String1.remove(0, Stinglaengebiszumkommer );

Serial.print("String1");
"1"
Ich möchte von Position 0 bis zum Kommers alles löschen und somit den endgültigen String erhalten.
String1 und String2 haben immer unterschiedliche längen.

Lg sebastiano

x

schön.
Wie lautet die Frage?

Die frage lautet ein String länge Zählen bis zu einem Delimiter...
nicht die ganze länge...

Da String2 Dein Delimiter ist:
Serial.println(String1.indexOf(String2));
ergibt 18.

ich habe das grade so gemacht den sonnst wüsste ich jetzt grade nicht wirklich wie...

String Messagelangth = "/Rgbsetting/ Plain: Sliderrgb1Ranges=";
Message.length() enthält den String aus Messagelangth + den wert hintern komma kommt aus den Slider über POST.

int Remove2 = Message.length() - Messagelangth.length();
int Remove3 = Message.length() - Remove2;
Serial.println(Remove3);

Ergibt dann immer 37 und ich kann so von 0 -> 37 alles löschen.
Wird mir denke ich auch nix anders überbleiben, wie dem den ganzen String mit zu teilen?.

Du sprichst in Rätseln. Ich sehe nirgendwo ein Komma... Und was ist das:

Was willst Du erreichen?

wieso in Rätzel..

.remove(0, 36);

Ich weiß aber nie wie lang es ist bis zum =

Also möchte ich die Länge (BIS zum Gleichzeichen, und alles löschen bis dahin ).
Übrig bleibt dann nur was hinterm = ist.
Der String hat immer unterschiedliche länge, z.b

message.indexOf("Sliderrgb1Range=") > oder
message.indexOf("rgb5col=") >

Und meine Funktion soll den gesamten Message Außer was hinter den = ist Löschen.

String String1 = "/Settings/ Plain: Sliderrgb1Ranges=1";

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  byte anzahl = String1.lastIndexOf("=");
  String1.remove(0, anzahl + 1);
  Serial.println(String1);
}

void loop()
{
}

Perfekt danke dir genau das wollte ich lastIndexOf("=") +1 :slightly_smiling_face:

Dann markier das als Lösung und gut ist.

Bitte beachte, dass, wenn das gesuchte nicht vorkommt, -1 zurück gegeben wird. Da ich byte verwende, wird daraus 255 und bei +1 kommt es zum Überlauf auf 0. Damit passt das für's remove.
Wenn Du auswerten willst, ob Dein zeichen enthalten ist, solltest Du int verwenden und musst dann auf >0 prüfen, bevor Du versuchst zu löschen.

//slider seite Dort wo der Message ankommt.

//RgbSlider
if(message.indexOf("Sliderrgb1Range=") > 0){
  Eepromwrite(message, 0, 145,  146);
}

//EEprom schreibfunktion

void Eepromwrite(String Message, int Ewrite1, int Ewrite2, int Ewrite3){
  byte anzahl = Message.lastIndexOf("=");
  Message.remove(0, anzahl + 1);
  Message.replace("\n", "");
  if(Ewrite1 >0){
  EEPROM.write(Ewrite1, Message.length() /10);
  }
  if(Ewrite2 >0){
  EEPROM.write(Ewrite2, Message.length() %10);
  }
  for (unsigned int i = 0; i < Message.length(); i++){
   EEPROM.write(Ewrite3 + i , Message[i]);
  }
  EEPROM.commit();
}

Wird noch etwas erweitert sollte aber denke ich ganz ok sein, was meinst du dazu.

benutze EEPROM.update().

Muss ich nicht dafür erst einmal etwas geschrieben haben? wo ist der unterschied zwischen Update und write?

Verstehe den unterschied nicht auf der Seite.
Update soll die Lebensdauer verlängern? aber wenn ich nie was dort geschrieben habe funktioniert es auch?

Einmal irgendwas reinschreiben.
Du hast doch Variablen. Die kannst Du auch vorbelegen und einmal im Setup reinschreiben. Dann die Zeile(n) auskommentieren.

Wenn Du übrigens für die Ewrite-Variablen nur ein byte brauchst, dann nmm auch nur ein byte.
Ein int belegt 2 bytes.

Ein guter Übersetzer, da ich kein english kann... www.deepl.com

Update schreibt dann ein Byte in das EEPROM, wenn sich der zu schreibende Inhalt von dem Inhalt der Speicherzelle unterscheidet. Sind die Werte identisch erfolgt kein Schreibzugriff.

Write schreibt immer....

Ja da hast du recht habe ich gar nicht dran gedacht.

ABER bei mir geht update nicht..

src\Functions.h:43:10: error: 'class EEPROMClass' has no member named 'update'

Kann es sein, das Du einen ESP benutzt?
Dann schreib das dazu.

ja sorry ja esp8266

der Code macht wenig Sinn.
erstens gibt es komfortable EEPROM.put() und EEPROM.get() Funktionen - auch für die EEPROM Emulation am ESP -
und zweitens wäre die Adressverwaltung im EEPROM über ein Struct einfacher und weniger fehleranfällig.

Naja der sinn dahinter ist das mein Ota Update inzwischen die Obergrenze von 1Mb erreicht hat, und ich mit diese Funktion einiges an Platz spare.
Den JavaScript Anteil habe ich auch bereits optimiert.

und zweitens wäre die Adressverwaltung im EEPROM über ein Struct einfacher und weniger fehleranfällig.

Hättest du ein Beispiel?