Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Problem mit Konvertierung von Buffer()

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Problem mit Konvertierung von Buffer()

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

      Hi,

      ich bin verzeifelt, weil ich seit etwa 8 Std. den Fehler nicht finde.

      var data  = '4105000155250282';
      var buf = new Buffer(data, 'hex');
      adapter.log.debug(buf);
      
      

      Der Debugger gibt AU%� aus.

      Gibt man dies hier ein: http://www.asciitohex.com/, so sieht man, dass ich folgende Dezimal Variable zurückerhalte: 65 5 1 85 37 2 239 191 189

      Ich vermute SEHR stark, dass es mit dem Zeichensatz zu tun habe, aber bekomme es einfach nicht sauber auf die Reihe.

      Ich hoffe nun, dass sich hier ein paar Profis tummeln, die mir weiter helfen können.

      PS: Das alles wird ein neuer Adapter (wenn es denn dann irgendwann mal läuft).

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

        Da "Buffer" alles mögliche enthalten können wäre ich mit logging von "buf" vorsichtig weil Du nicht weisst wie er das ausgibt. Ich kann mir gut vrostellen das er das erste Zeichen als ASCII erkennt und deswegen von Text ausgeht.

        am besten

        > buf.toString('hex');

        nutzen:

        https://nodejs.org/api/buffer.html#buff … _start_end

        1 Reply Last reply Reply Quote 0
        • N
          NightWatcher last edited by

          Alles schon probiert. Ich sitze heute bereits ungelogen 9 Std. an dem einen Problem.

          Ich lasse Wireshark mitlaufen und im Debug vom ioBroker Log alles ausgeben.

          Egal, wie ich es kodiere, es kommt NIE das raus, was ich möchte.

          Ich prüfe sogar, ob der String utf ist

          if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))
          
          1 Reply Last reply Reply Quote 0
          • apollon77
            apollon77 last edited by

            Warm sollten es denn Strings sein? da ist 0x05 und 0x00 dabei, das sind keine sinnvollen Zeichen … Damit ist ein Vergleich auf "String"-Ebene sehr schwierig

            1 Reply Last reply Reply Quote 0
            • N
              NightWatcher last edited by

              Es sollen keine Strings sein.

              Das Gerät auf der anderen Seite reagiert und sendet Hexadezimale Werte.

              Ich sende 16 00 00 ohne Probleme.

              Beim Wert: "41 05 00 01 55 25 02 82" moniert er einzig das Byte 82. Lasse ich das weg, wird der ganze Wert korrekt übertragen. (Es fehlt halt leider nur die 82)

              die 82 konvertiert er in "ef bf bd".

              Kurzum: Grundsätzlich funktioniert es. Nur komischerweise wandelt er in diesem Beispiel die 82 in "ef bf bd" um.

              Was eben auch komisch ist, dass das Script "160000" als utf8 erkennt, "4105000155250282" aber eben nicht. Gleiche Datei. Ich stehe mittlerweile auch total auf dem Schlauch, weil der Kopf raucht 😐

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

                Was willst Du mit UTF-8? Das ist eine String kodierung und du sagtst es sind keine "Strings". Also was genau tust Du mit den Daten?

                Also ein

                var data  = '4105000155250282';
                var buf = new Buffer(data, 'hex');
                adapter.log.debug(buf.toString('hex');
                

                Müsste genau die Ausgabe geben wie dein EIngabestring

                1 Reply Last reply Reply Quote 0
                • N
                  NightWatcher last edited by

                  Nach Recherche im Internet hat die Node.js Buffer Funktion teilweise Probleme damit, wenn man die Daten in einer falschen Kodierung übermittelt.

                  Das konnte ich soweit auch reproduzieren. Und ja sogesehen hast du recht, dass ich die Daten als String an Buffer übergebe. So soll es nach der Funktionsdokumentation auch sein.

                  var buf = Buffer.from('160000', 'hex');

                  if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))

                  –> ergibt true --> die Daten werden korrekt übertragen [ 16 00 00 steht in Wireshark ]

                  var buf = Buffer.from('4105000155250282', 'hex');

                  if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))

                  –> ergibt false --> die Daten werden fehlerhaft übertragen [ 41 05 00 01 55 25 02 ef bf bd steht in Wireshark ] erwartet wird aber 41 05 00 01 55 25 02 82

                  Meine Konkrete Frage ist einfache, wieso in dem Fall die 82 falsch umgewandelt und übertragen wird. Ich denke, es hat mit der Kodierung zu tun (deshalb eben auch der Hinweis darauf). Vielleicht liege ich hier auch total daneben.

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

                    Wie sieht denn der code aus der das raussendet? Und warum sendest DU nicht den "Binären" Buffer (also das was du dort als Hex vorgibst) direkt raus? Warum machst Du Dinge mit utf-8? Du willst die bytes so raussenden wie du sie im Buffer hast. Ergo: Nichts rumkonvertieren sondern den Buffer so wie Du Ihn hier erstellst senden. Du brauchst keine UTF-8 konvertierungen zu machen!!

                    Warum er sowa macht ist recht einfach:

                    "82" ist 130 dezimal. UTF-8 ist nur bis 127 dezomal identisch. Alles höhere wird mittels Zusatzbytes kodiert. In dem Fall kodiert er damit die "82" in in Summe 3 Bytes. Nach UTF-8 kodierlogik korrekt, daher: Lass das UTF-8 kodiere wenn Du die reinen Bytes haben willst!

                    1 Reply Last reply Reply Quote 0
                    • N
                      NightWatcher last edited by

                      Ich würde es gerne so lassen.

                      var data = '4105000155250282';

                      var buf = new Buffer(data, 'hex');

                      War erst mein Code zu Anfang. Ich meine, es ging auch mal kurz. Aber auch da bekomme ich leider immer nur "41 05 00 01 55 25 02 ef bf bd" im Wireshark.

                      EDIT, sorry deine erste Frage vergessen zu beantworten.

                      Es läuft über eine Telnet Sitzung. Das dürfte aber vermutlich egal sein, denn das buffer object ist ja bereits vorher falsch.

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

                        Dein code den Du hier zeigst zeigt nur wie der Buffer initialisiert wird. Wie versendest Du ihn?

                        Wenn Du sagst das Wireshark was hat dann musst Du das irgendwie ausgeben. Sag jetzt bitte nicht das Du eine Text-Telnet Session hast und dort dann per "console.log" deinen Buffer ausgibst?!

                        Das kann dann nicht tun weil 0x82 kein ASCII ist und daher wahrscheinlich deine Telnet Session eine kodierung braucht. Warum telnet und nicht ein TCP Socket?!

                        1 Reply Last reply Reply Quote 0
                        • N
                          NightWatcher last edited by

                          Moin, dein Beitrag hat mich zum Umdenken gebracht. Dafür vielen Dank.

                          Nach dem Wechsel von Telnet auf TCP habe ich die Probleme in den Griff bekommen und habe nun die ersten Werte zurückerhalten.

                          Das ist übrigens daraus entstanden: http://forum.iobroker.net/viewtopic.php?f=30&t=8803

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          826
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

                          2
                          11
                          931
                          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