NEWS
Decode64 vor und zurück...
-
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 -
@andy200877 sagte: base64
Es gibt ein NPM-Modul ... und weitere.
-
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"));
-
@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 ?
-
@andy200877
das ist die letzte Zeile mit b.toString, das codiertmeine 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
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 -
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] ??
-
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 herausbeispielarray
0,1,2,3,4
würde dann
2,3
zurückgegeben werden -
@oliverio sagte: evtl so?
Das erspart natürlich ein zusätzliches NPM-Modul
-
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'))
-
@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