Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Readfile() json => Ergebnis mal Object mal ArrayBuffer

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    15
    1
    626

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    628

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

Readfile() json => Ergebnis mal Object mal ArrayBuffer

Geplant Angeheftet Gesperrt Verschoben Entwicklung
11 Beiträge 3 Kommentatoren 960 Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • apollon77A Offline
    apollon77A Offline
    apollon77
    schrieb am zuletzt editiert von
    #2

    Ließ mal https://nodejs.org/api/fs.html

    Das liegt daran das du (Annahme weil hast leider deinen Code nicht gepostet) kein encoding setzt.

    Ob du dann ein String oder ein arraybuffer bekommst hängt davon ab wie das encoding der Datei ist.

    Wenn du auch ein encoding angibst sollte es immer ein String sein.

    Gesendet vom Handy …

    Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

    • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
    • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
    1 Antwort Letzte Antwort
    0
    • snadorS Offline
      snadorS Offline
      snador
      schrieb am zuletzt editiert von
      #3

      Ich nutze die connection class aus der conn.js des socket.io Adapters. Dort sieht die Funktion wie folge aus:

      readFile:         function (filename, callback, isRemote) {
              if (!callback) throw 'No callback set';
      
              if (this._type === 'local') {
                  try {
                      var data = storage.get(filename);
                      callback(null, data ? JSON.parse(storage.get(filename)) : null);
                  } catch (err) {
                      callback(err, null);
                  }
              } else {
                  if (!this._checkConnection('readFile', arguments)) return;
      
                  if (!isRemote && typeof app !== 'undefined' && !app.settings.dontCache) {
                      app.readLocalFile(filename.replace(/^\/vis\.0\//, ''), callback);
                  } else {
                      var adapter = this.namespace;
                      if (filename[0] === '/') {
                          var p = filename.split('/');
                          adapter = p[1];
                          p.splice(0, 2);
                          filename = p.join('/');
                      }
      
                      this._socket.emit('readFile', adapter, filename, function (err, data, mimeType) {
                          setTimeout(function () {
                              callback(err, data, filename, mimeType);
                          }, 0);
                      });
                  }
              }
          },
      

      Dort scheint es keinen Option bzgl. der Angabe der Codierung zu geben.

      1 Antwort Letzte Antwort
      0
      • apollon77A Offline
        apollon77A Offline
        apollon77
        schrieb am zuletzt editiert von
        #4

        Dann musst Du ggf den ArrayBuffer in String umwandeln indem Du da das Encoding nutzt

        Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

        • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
        • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
        1 Antwort Letzte Antwort
        0
        • snadorS Offline
          snadorS Offline
          snador
          schrieb am zuletzt editiert von
          #5

          Mich wundert nur, dass es mit einem File geht und mit einem anderen nicht :-) Ich werd nicht so ganz schlau daraus…

          1 Antwort Letzte Antwort
          0
          • snadorS Offline
            snadorS Offline
            snador
            schrieb am zuletzt editiert von
            #6

            Zudem werd ich aus den Infos aus dem Web nicht ganz schlau. :-( In dem ArrayBuffer des JSON Files liegen ja unterschiedlich Arrays drin. (siehe Screen) Welches nehme ich und wie kann ich es sinnvoll dekodieren.
            4236_arraybuffer.jpg

            1 Antwort Letzte Antwort
            0
            • apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #7

              Google is your friend :-))

              https://github.com/inexorabletash/text-encoding

              keine Ahnung hab ich auch noch nie gemacht :-)

              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
              1 Antwort Letzte Antwort
              0
              • snadorS Offline
                snadorS Offline
                snador
                schrieb am zuletzt editiert von
                #8

                Danke für Deine Hilfe. Zur Vollständigkeit :-) - Statt eine Lösung für unzählige Encodings einzubinden behelfe ich mir mit einer kleinen Funktion die UTF8Arrays konvertiert.

                convertUtf8ArrayToStr:function(array) {
                        var out, i, len, c;
                        var char2, char3;
                
                        out = "";
                        len = array.length;
                        i = 0;
                        while(i < len) {
                        c = array[i++];
                        switch(c >> 4)
                        { 
                          case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                            // 0xxxxxxx
                            out += String.fromCharCode(c);
                            break;
                          case 12: case 13:
                            // 110x xxxx   10xx xxxx
                            char2 = array[i++];
                            out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                            break;
                          case 14:
                            // 1110 xxxx  10xx xxxx  10xx xxxx
                            char2 = array[i++];
                            char3 = array[i++];
                            out += String.fromCharCode(((c & 0x0F) << 12) |
                                           ((char2 & 0x3F) << 6) |
                                           ((char3 & 0x3F) << 0));
                            break;
                        }
                        }
                
                        return out;
                    }
                

                Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.

                if(typeof theData == 'object'){
                    var uint8Array = new Uint8Array(theData);
                    if(typeof uint8Array == 'object'){
                        theData = ngl.convertUtf8ArrayToStr(uint8Array);
                    }
                }
                

                Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar.

                LG

                1 Antwort Letzte Antwort
                0
                • AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  schrieb am zuletzt editiert von
                  #9

                  @snador:

                  Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.

                  Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar. `

                  Wie wäre es mit

                  if (theData instanceof Uint8Array) { // bzw instanceof ArrayBuffer
                    // ...
                  }
                  

                  Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                  1 Antwort Letzte Antwort
                  0
                  • snadorS Offline
                    snadorS Offline
                    snador
                    schrieb am zuletzt editiert von
                    #10

                    Das ergibt bei mir false :-) Wenn ich anhand meines Codes oben

                    if(uint8Array instanceof Uint8Array)
                    

                    checke dann natürlich true. Das kann ich auch mit

                    if(ArrayBuffer.isView(uint8Array))
                    

                    machen. So mache ich es mitterweile. Allerdings habe ich bei beiden Varianten das View schon aus dem ArrayBuffer geholt.

                    Mir war eher dran gelegen ob ich einfach prüfen kann ob der Return ein ArrayBuffer ist.

                    LG

                    1 Antwort Letzte Antwort
                    0
                    • snadorS Offline
                      snadorS Offline
                      snador
                      schrieb am zuletzt editiert von
                      #11

                      Sorry theData instanceof ArrayBuffer funzt natürlich… Danke!

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      542

                      Online

                      32.6k

                      Benutzer

                      81.9k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe