Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Decode64 vor und zurück...

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Decode64 vor und zurück...

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

      Ich bastel gerade an einem Script um meine Klimaanlage in IOB einzubinden.

      Leider scheitert es in meinem Script an ein paar Konvertierungen.

      Ich habe hier in diesem Beispielscript einen Inputstring

      var inputString = "AADijqL/AAAIAAAQCwAAAAAAAf/////bioAEQAYioAAQiAAAAAEAAAAAAAOAIKD/gBDK/5QQAADJqQ==";
      

      Dieser wird nun base64 decodiert und dann in ein bytearray abgelegt.

      Danach soll das Script alles wieder erneut codieren, sodass am ende wieder das gleiche Ergebnis wie am Anfang herauskommt.

      Hintergrund bei der ganzen Geschichte ist, das im Inputstring die Einstellungen wie Temperatur usw. der Klimaanlage hinterlegt sind. Diese kann ich erfolgreich auslesen. Zum steuern der Anlage muss ich diese Daten aber ändern und danach wieder codieren.

      Also versuche ich im Moment erstmal nur den Inputstring zu de.- und anschließend wieder zu codieren. Wenn alles richtig ist, sollte ja wieder der gleiche "Inputstring" wie am Anfang dabei herauskommen.
      Leider passiert das aber nicht.. 😞

      Das ist die Logausgabe meines Scripts :

      INPUT : 'AADijqL/AAAIAAAQCwAAAAAAAf/////bioAEQAYioAAQiAAAAAEAAAAAAAOAIKD/gBDK/5QQAADJqQ=='
      AFTER DECODE64 : '⎢ÿÿÿÿÿۊ€@" ˆ€  ÿ€Êÿ”É©'
      AFTER STR2UTF : '0,0,0,0,226,0,142,0,162,0,255,0,0,0,0,0,8,0,0,0,0,0,16,0,11,0,0,0,0,0,0,0,0,0,0,0,1,0,255,0,255,0,255,0,255,0,219,0,138,0,128,0,4,0,64,0,6,0,34,0,160,0,0,0,16,0,136,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,128,0,32,0,160,0,255,0,128,0,16,0,202,0,255,0,148,0,16,0,0,0,0,0,201,0,169,0'
      
      WIEDER UTF2STR : ''
      WIEDER DECODE64 : 'JTAwJTAwJUUyJThFJUEyJUZGJTAwJTAwJTA4JTAwJTAwJTEwJTBCJTAwJTAwJTAwJTAwJTAwJTAxJUZGJUZGJUZGJUZGJURCJThBJTgwJTA0QCUwNiUyMiVBMCUwMCUxMCU4OCUwMCUwMCUwMCUwMSUwMCUwMCUwMCUwMCUwMCUwMyU4MCUyMCVBMCVGRiU4MCUxMCVDQSVGRiU5NCUxMCUwMCUwMCVDOSVBOQ=='
      

      Wie schon gesagt die Punkte "AFTER DECODE64 und AFTER STR2UTF" liefern die richtigen Ergebnisse...

      Und zum Schluss nun mein Script :

      var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
      
      var inputString = "AADijqL/AAAIAAAQCwAAAAAAAf/////bioAEQAYioAAQiAAAAAEAAAAAAAOAIKD/gBDK/5QQAADJqQ==";
      var afterdecode64 = decode64(inputString)
      var afterstr2utf = strToUtf16Bytes(afterdecode64)
      
      var xxx = ""
      var wiederdecode64 = encode64(afterdecode64)
      
      
      log ("INPUT : '" + inputString+ "'")
      log ("AFTER DECODE64 : '" + afterdecode64 + "'")
      log ("AFTER STR2UTF : '" + afterstr2utf + "'");
          
      log ("WIEDER UTF2STR : '" + xxx + "'")
      log ("WIEDER DECODE64 : '" + wiederdecode64 + "'")
      
      
      
      // ************************************************
      // ******************* UTILITYS *******************
      // ************************************************
      
      
      function strToUtf16Bytes(str) {
        const bytes = [];
        for (ii = 0; ii < str.length; ii++) {
          const code = str.charCodeAt(ii); // x00-xFFFF
          bytes.push(code & 255, code >> 8); // low, high
        }
        return bytes;
      }
      
      
      function encode64(input) {
           input = escape(input);
           var output = "";
           var chr1, chr2, chr3 = "";
           var enc1, enc2, enc3, enc4 = "";
           var i = 0;
      
           do {
              chr1 = input.charCodeAt(i++);
              chr2 = input.charCodeAt(i++);
              chr3 = input.charCodeAt(i++);
      
              enc1 = chr1 >> 2;
              enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
              enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
              enc4 = chr3 & 63;
      
              if (isNaN(chr2)) {
                 enc3 = enc4 = 64;
              } else if (isNaN(chr3)) {
                 enc4 = 64;
              }
      
              output = output +
                 keyStr.charAt(enc1) +
                 keyStr.charAt(enc2) +
                 keyStr.charAt(enc3) +
                 keyStr.charAt(enc4);
              chr1 = chr2 = chr3 = "";
              enc1 = enc2 = enc3 = enc4 = "";
           } while (i < input.length);
      
           return output;
      }
      
      function decode64(input) {
           var output = "";
           var chr1, chr2, chr3 = "";
           var enc1, enc2, enc3, enc4 = "";
           var i = 0;
      
           // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
           var base64test = /[^A-Za-z0-9\+\/\=]/g;
           if (base64test.exec(input)) {
              alert("There were invalid base64 characters in the input text.\n" +
                    "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
                    "Expect errors in decoding.");
           }
           input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
      
           do {
              enc1 = keyStr.indexOf(input.charAt(i++));
              enc2 = keyStr.indexOf(input.charAt(i++));
              enc3 = keyStr.indexOf(input.charAt(i++));
              enc4 = keyStr.indexOf(input.charAt(i++));
      
              chr1 = (enc1 << 2) | (enc2 >> 4);
              chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
              chr3 = ((enc3 & 3) << 6) | enc4;
      
              output = output + String.fromCharCode(chr1);
      
              if (enc3 != 64) {
                 output = output + String.fromCharCode(chr2);
              }
              if (enc4 != 64) {
                 output = output + String.fromCharCode(chr3);
              }
      
              chr1 = chr2 = chr3 = "";
              enc1 = enc2 = enc3 = enc4 = "";
      
           } while (i < input.length);
      
           return unescape(output);
      }
      

      Vielleicht ist ja ein Experte hier, der mir dabei helfen kann... Das wäre echt super...
      Vielen Dank

      paul53 OliverIO 2 Replies Last reply Reply Quote 0
      • paul53
        paul53 @Andy200877 last edited by paul53

        @andy200877 sagte: base64

        Es gibt ein NPM-Modul ... und weitere.

        1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @Andy200877 last edited by OliverIO

          @andy200877

          evtl so?
          buffer muss nicht deklariert werden, da es in node schon mit eingebaut ist.

          var s="AADijqL/AAAIAAAQCwAAAAAAAf/////bioAEQAYioAAQiAAAAAEAAAAAAAOAIKD/gBDK/5QQAADJqQ==";
          var b = Buffer.from(s, "base64");
          console.log(b.toJSON());
          console.log(b.toString("base64"));
          
          A paul53 2 Replies Last reply Reply Quote 1
          • A
            Andy200877 @OliverIO last edited by

            @oliverio sagte in Decode64 vor und zurück...:

            var b = Buffer.from(s, "base64");

            Und wie komme ich wieder zurück auf den "Ursprungsstring" s ?

            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @Andy200877 last edited by OliverIO

              @andy200877
              das ist die letzte Zeile mit b.toString, das codiert

              meine logausgabe in iobroker

              9:09:24.399	info	javascript.0 (4577) script.js.Test.Skript_3: {'type':'Buffer','data':[0,0,226,142,162,255,0,0,8,0,0,16,11,0,0,0,0,0,1,255,255,255,255,219,138,128,4,64,6,34,160,0,16,136,0,0,0,1,0,0,0,0,0,3,128,32,160,255,128,16,202,255,148,16,0,0,201,169]}
              19:09:24.400	info	javascript.0 (4577) script.js.Test.Skript_3: AADijqL/AAAIAAAQCwAAAAAAAf/////bioAEQAYioAAQiAAAAAEAAAAAAAOAIKD/gBDK/5QQAADJqQ==
              

              die zeile mit toJSON zeigt dir dein bytearray
              (also Buffer ist das Datenkonstrukt für Bytearrays in node und hat viele verschiedene codier und decodierfähigkeiten
              2da08b1f-7295-4bb2-ac1f-84ff8f7494bd-image.png

              und hier die Dokumentation zu buffer
              https://nodejs.org/api/buffer.html
              leider finde ich, das die node doku nicht ganz so einfach zu lesen ist.
              aber im zweifel findet man auf stackoverflow.com Beispiele

              1 Reply Last reply Reply Quote 0
              • A
                Andy200877 last edited by

                Ich werde es mir morgen nochmal anschauen... Vielen Dank nochmal....

                Im Orginal Python Script, wurde es wie folgt gemacht :

                 return str(b64encode(bytes(command + receive)))[2:-1]
                

                Wozu dient das [2:-1] ??

                OliverIO 1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @Andy200877 last edited by OliverIO

                  @andy200877

                  Schon lang her, das ich mich mit python beschäftigt habe.
                  Aber das sieht nach slicing aus.
                  schneide aus dem vorhandenen array ab dem 3.element bis zum vorletzten heraus

                  beispielarray
                  0,1,2,3,4
                  würde dann
                  2,3
                  zurückgegeben werden

                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @OliverIO last edited by

                    @oliverio sagte: evtl so?

                    Das erspart natürlich ein zusätzliches NPM-Modul 👍

                    A 1 Reply Last reply Reply Quote 0
                    • A
                      Andy200877 @paul53 last edited by Andy200877

                      Das mit dem "Zurückcodieren" funktioniert nun. Vielen Dank nochmal für Eure Unterstützung....

                      Hat jemand eine gute Übersetzung zu diesem python-Part ?

                      receive = RacParser.add_crc16(
                                  self,
                                  RacParser.add_variable(self, RacParser.recieve_to_bytes(self, aircon_stat)),
                      
                      
                      
                          def crc16ccitt(self, data):
                              # Convert to signed integers instead of bytes
                              data = [(256 - a) * (-1) if a > 127 else a for a in data]
                      
                              i = 65535
                              for b in data:
                                  for i2 in range(8):
                                      z = True
                                      z2 = ((b >> (7 - i2)) & 1) == 1
                                      if ((i >> 15) & 1) != 1:
                                          z = False
                                      i = i << 1
                                      if z2 ^ z:
                                          i ^= 4129
                              return i & 65535
                      
                          def add_crc16(self, byte_buffer: bytearray):
                              crc = RacParser.crc16ccitt(self, byte_buffer)
                      
                              return byte_buffer + [crc & 255, (crc >> 8) & 255]
                              # return ByteBuffer + (crc.to_bytes(2, 'big'))
                      
                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @Andy200877 last edited by OliverIO

                        @andy200877 sagte in Decode64 vor und zurück...:

                        crc16ccitt

                        und mit welcher Zeile hast du Probleme.
                        Dürfte alle ziemlich direkt in den syntax von javascript übertragbar sein.
                        sehe da keine besonderen funktionen,
                        oder suchst du jemand der es für dich macht?

                        evtl hilft die ja das hier?
                        https://extendsclass.com/python-to-javascript.html

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        434
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        342
                        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