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
  TTGO ESP32 SIM800L Pinout Stromversorgung pcfritz 1 123 18.04.2021 14:40
Letzter Beitrag: hotsystems
  Problem Upload einer html Datei per littleFS mat-sche 8 344 18.04.2021 14:12
Letzter Beitrag: mat-sche
  ESP32 Daten aus HTML Roger100499 11 395 15.04.2021 15:00
Letzter Beitrag: Tommy56
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 23 3.539 09.04.2021 16:15
Letzter Beitrag: amshh
  formatierung von csv dateien in LittleFS gk_1 6 356 04.04.2021 17:56
Letzter Beitrag: Tommy56
  Suche Erfahrungen und Hilfe mit ESP32-CAM WiFi + Bluetooth Modul Kamera Modul esp32 Christian_Moba-Arduino 28 1.710 04.04.2021 08:24
Letzter Beitrag: amithlon
  ESP32 CAM Flashlamp schalten RaspiUser0815 13 3.287 28.03.2021 21:51
Letzter Beitrag: Grufti99
  ESP32-cam WAV´s einmalig auf GPI0 25/26 abspielen Sarastro 2 358 28.03.2021 10:45
Letzter Beitrag: Sarastro
  Led-Matrix 8x32 mit Esp32 Zerrus 5 472 27.03.2021 14:16
Letzter Beitrag: hotsystems
  Esp32 MD-Parola Scrolltext wwilhelm 3 399 26.03.2021 22:35
Letzter Beitrag: Tommy56

Gehe zu:


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