Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Readfile() json => Ergebnis mal Object mal ArrayBuffer

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Readfile() json => Ergebnis mal Object mal ArrayBuffer

    This topic has been deleted. Only users with topic management privileges can see it.
    • apollon77
      apollon77 last edited by

      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 …

      1 Reply Last reply Reply Quote 0
      • snador
        snador last edited by

        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 Reply Last reply Reply Quote 0
        • apollon77
          apollon77 last edited by

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

          1 Reply Last reply Reply Quote 0
          • snador
            snador last edited by

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

            1 Reply Last reply Reply Quote 0
            • snador
              snador last edited by

              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 Reply Last reply Reply Quote 0
              • apollon77
                apollon77 last edited by

                Google is your friend :-))

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

                keine Ahnung hab ich auch noch nie gemacht 🙂

                1 Reply Last reply Reply Quote 0
                • snador
                  snador last edited by

                  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 Reply Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer last edited by

                    @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
                      // ...
                    }
                    
                    1 Reply Last reply Reply Quote 0
                    • snador
                      snador last edited by

                      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 Reply Last reply Reply Quote 0
                      • snador
                        snador last edited by

                        Sorry theData instanceof ArrayBuffer funzt natürlich… Danke!

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        804
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        3
                        11
                        832
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo