INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
13.12.2020, 22:59
Beitrag #1
ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Hallo Community,

ich nutze den ESP32 mit der Arduino IDE und suche eine Lösung um Daten, die ein Nutzer über ein Webinterface absendet, in einer Datei (LittleFS-Dateisystem) zu speichern. Die Daten erhalte ich als JSON-String, der hexadezimale Bytefolgen enthält. Diese können jeden möglichen Wert, also auch Zerobytes enthalten. Die Anzahl Bytes ist vorher unbekannt, kann viele Kilobytes betragen.

Jetzt muss ich diese Daten weiter verarbeiten und byteweise in einer Datei speichern. Und das natürlich binär, um den Overhead an Speicherbedarf durch die hexadezimale Formatierung zu umgehen.

Problem 1:
Wie schreibe ich Zero-Bytes in einen String, um dessen Inhalt dann im Filesystem zu speichern? Angeblich können richtige Strings aus der String-Klasse Zerobytes beinhalten.

Folgendes Beispiel funktioniert nicht:
Code:
char buffer[] = {0x65, 0x66, 0x67, 0x68, 0x00, 0x65, 0x66, 0x00, 0x00, 0xff, 0x00};
String saveStr = String(buffer);
Serial.println(saveStr);
Der String endet beim ersten Nullbyte.

Gibt es eine Notation für Nullbytes in Strings? Ich glaube ich habe sie durch Ausprobieren gefunden. Doch folgendes Beispiel funktioniert auch nicht:
Code:
String saveStr = "ab\00cdefghijklm";
Serial.println(saveStr.substring(4, 6));
Das Beispiel gibt nichts aus und Serial.println(saveStr); gibt wieder nur den Inhalt bis zum ersten Zerobyte aus, also "ab".

Angenommen ich finde hierfür eine Lösung, lässt sich ein solcher String dann überhaupt im LittleFS-Filesystem nach folgendem Schema speichern? Oder weiß jemand eine bessere Lösung? Bin aber aufgrund des Projekts auf LittleFS angewiesen.
Code:
File file = LITTLEFS.open(path, FILE_WRITE);
file.print(saveStr);
file.close();

Bin für jeden Hinweis dankbar.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 10:04
Beitrag #2
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Du darfst nicht den Umweg über einen String gehen, sondern musst die Zeichen einzeln mit write schreiben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 10:33
Beitrag #3
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Strings sind Zeichenketten - also druckbare Daten. So ist das zumindest gedacht.
Was Du hast sind binäre Daten - da verwendet man 'klassische' Arrays. Das Ende der Daten kannst Du ja bei binären Daten ohnehin nur durch die Anzahl der gültigen Daten festlegen und nicht durch ein dediziertes Endezeichen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 12:41 (Dieser Beitrag wurde zuletzt bearbeitet: 14.12.2020 13:02 von ultralex.)
Beitrag #4
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 10:33)MicroBahner schrieb:  da verwendet man 'klassische' Arrays.
Ok, aber kann ich das zur Laufzeit dimensionieren und wieder freigeben? Die Anzahl Bytes hängt an der Stelle ja vom Anwender ab, würde das gerne flexibel halten.

(14.12.2020 10:04)Tommy56 schrieb:  ...musst die Zeichen einzeln mit write schreiben
Jedes Zeichen einzeln? Das dürfte für Flash-Speicher weder performance-technisch, noch in Bezug auf die Lebensdauer/Schreibzyklen gut sein (da physikalisch nur in Blöcken zugegriffen werden kann).

Außerdem werden viele Nullbytes abwechselnd mit anderen Werten enthalten sein, ich kann also auch nicht den Weg gehen dass ich blockweise jeweils bis zum nächsten Nullbyte schreibe. Ich kann natürlich auch ein Array als temporären Buffer verwenden. Aber LittleFS erwartet beim Schreiben ja ein String-Objekt, oder weiß jemand wie ich Byte-Arrays sinnvoll und performant in eine Datei schreibe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:23
Beitrag #5
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 12:41)ultralex schrieb:  Ok, aber kann ich das zur Laufzeit dimensionieren und wieder freigeben?
Klar, geht genau so, wie das auch die String-Klasse macht: mit 'new' und 'delete' ( oder malloc and free ). Ich weis aber nicht, wie gut die Speicherverwaltung beim ESP32 ist, und ob da auch mal aufgeräumt wird. Das Problem wäre aber bei 'String' und selber allozieren das gleiche.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:35
Beitrag #6
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Schon mal ein herzliches Dankeschön an eure Hilfe bisher, ich bin wirklich begeistert!

Offener Punkt wäre also zusammengefasst:
Wie kann ich mit LittleFS Arrays sinnvoll und performant in eine Datei schreiben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:44
Beitrag #7
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 12:41)ultralex schrieb:  Jedes Zeichen einzeln? Das dürfte für Flash-Speicher weder performance-technisch, noch in Bezug auf die Lebensdauer/Schreibzyklen gut sein (da physikalisch nur in Blöcken zugegriffen werden kann).
Ob Du 5 einzelne Zeichen schreibst oder 5 Zeichen auf einmal, ist dem Flash völlig egal, da sowieso erst geschrieben wird, wenn der Sektorpuffer (512 Bytes) voll ist oder mit flush bzw. close ein Schreiben erzwungen wird.

Was meinst Du, was intern das Schreiben des Strings macht? Richtig, es schreibt einzelne Zeichen.

Du kannst narürlich auch einen Puffer füllen und den dann schreiben. Ich hatte Dich ja schon auf write hingewiesen. write gibt es nicht nur für Einzelzeichen, sondern auch für Bytearrays mit Übergabe der Länge (write(puffer,länge)).

@Microbahner: Wer sollte da aufräumen?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 14:31 (Dieser Beitrag wurde zuletzt bearbeitet: 14.12.2020 14:34 von MicroBahner.)
Beitrag #8
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 13:44)Tommy56 schrieb:  @Microbahner: Wer sollte da aufräumen?
Vermutlich niemand Wink . Da wird sich der RAM-Speicher mit der Zeit dann wohl auch fragmentieren, wenn man fleißig new und delete nutzt. Aber der ESP32 hat ja einiges davon.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32-Cam mit BLYNK nutzen 4711engel 2 123 24.07.2021 20:57
Letzter Beitrag: 4711engel
  ESP32 T-Watch 2020 Lilygo AnFi 18 6.005 23.07.2021 19:39
Letzter Beitrag: Vapalus
  ESP32-CAM Pan Tilt 4711engel 0 148 22.07.2021 18:35
Letzter Beitrag: 4711engel
  C++ Frage: Parameter in TXT-File speichern, auslesen und variable zuweisen basementmedia 6 210 21.07.2021 19:02
Letzter Beitrag: basementmedia
  ESP32 und sms kpc 27 3.875 11.07.2021 10:04
Letzter Beitrag: hotsystems
Wink ESP32 IR Empfang auf Core0 Flarki 9 932 30.06.2021 19:00
Letzter Beitrag: Flarki
  ESP32 LED D2 blinkt schnell Harry 17 1.777 29.06.2021 19:52
Letzter Beitrag: AnFi
  2 ESP32 laufen nicht zusammen SnecxXx 5 598 24.06.2021 17:08
Letzter Beitrag: hotsystems
  WS2812B LED an ESP32 ? Steinspiel 13 1.461 19.06.2021 22:41
Letzter Beitrag: Bitklopfer
  ESP32 Datei auf SD Karte durch Variable erstellen? Lor56 17 1.582 16.06.2021 13:40
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste