NEWS
Boolean Verknüpfung
-
Mein function-node hat noch Schönheitsfehler. Habe erst zuspät bemerkt, dass der Input Hex-Zahlen sind. Deshalb ist auf die Regular Expression kein Verlass. Außerdem verhält sich die string.split() Methode recht sperrig bei regEx. Mit string.match() gehts deutlich einfacher.
! ````
//splitte string in int-Array
let aI = msg.payload.match(/.{1,2}(?=(.{2})+(?!.))|.{1,2}$/g) //split in 2stellige strings
.map(x => parseInt(x,16)); //konvertiere HEX strings nach Integer
! //xor vom inputArray
let mustXor = aI[aI.length-1];
! //xor aus inputArry entfernen, ist nötig, damit sich die reduce() Methode verwenden läßt
aI.splice(-1, 1);
! //xor aus inputarry bilden
let ifXor = aI.reduce((v, vnext) => v ^ vnext);
! if (ifXor == mustXor) { //no error
! node.status({fill:"green",shape:"dot",text:'no error'})
node.send([{payload: aI[0]},
{payload: aI[1]},
{payload: aI[2]},
{payload: aI[3]},
{payload: aI[4]},
{payload: aI[5]},
{payload: aI[6]},
{payload: 'no error'}]);
! } else { //xor errornode.status({fill:"red",shape:"dot",text:'XOR error'}) node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]);}
! ````
Du kannst den beiliegenden Code einfach komplett in das function-node pasten.
Ist soweit eigentlich kommentiert. Ansonsten frag einfach.
-
Top. Das geht. Danke.
In "mustXor" steht der errechnete Wert, soviel hab ich verstanden. Wie bekomme ich ihn wieder in Hex gewandelt, also damit 3A anstatt 58 drin steht ? Am besten auch immer 2stellig. D.h. wenn ich eine 4 habe, brauche ich in Hex genauer genommern eine 04.
-
Also mit toString() Methode kannst du eine Zahl wieder in einen String konvertieren.
https://www.w3schools.com/jsref/jsref_t … number.asp
Also falls do mustXor wieder als String brauchst, wäre das mustXor.toString(16). Aber wozu? Der XOR Test ist ja schon gemacht.
-
Weil ich einen Sheldon-Tick habe und die beiden auch noch in 2 Objekten sehen will.
6863_unbenannt.jpg -
Na dann schreib ihn vlt. gleich zum Ausgang 8.
if (ifXor == mustXor) { //no error node.status({fill:"green",shape:"dot",text:'no error'}) node.send([{payload: aI[0]}, {payload: aI[1]}, {payload: aI[2]}, {payload: aI[3]}, {payload: aI[4]}, {payload: aI[5]}, {payload: aI[6]}, {payload: mustXor.toString(16)}]); } else { //xor error node.status({fill:"red",shape:"dot",text:'XOR error'}) node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]); }Falls du ihn im Fehlerfall auch haben willst, dann halt statt {payload: 'XOR error'} ebenfalls {payload: mustXor.toString(16)}
-
Ok ist drin. Funkioniert. Und wie bekomme ich den letzten Schönheitsfehler noch raus, 2Stellig ? ich suche gerne bei google "node red String format". Ich finde was mit "%2" oder so ähnlich. Kenn ich auch C, hab ich die Syntax noch nicht richtig drin.
-
Sorry, ich seh grad, das geht wohl in node-red nicht mit dem padstart() hier getestet: https://www.jdoodle.com/execute-nodejs-online
Muss mal sehen was man da machen kann.
-
Nicht schön, aber auf die Schnelle fällt mir auch nur eine eigene Funktion ein.
//splitte string in int-Array let aI = msg.payload.match(/.{1,2}(?=(.{2})+(?!.))|.{1,2}$/g) //split in 2stellige strings .map(x => parseInt(x,16)); //konvertiere HEX strings nach Integer //xor vom inputArray let mustXor = aI[aI.length-1]; //xor aus inputArry entfernen aI.splice(-1, 1); //xor aus inputaary bilden let ifXor = aI.reduce((v, vnext) => v ^ vnext); let fix2 = (x) => ('0'+x).slice(-2); // einstelligen String mit führender Null if (ifXor == mustXor) { //no error node.status({fill:"green",shape:"dot",text:'no error'}) node.send([{payload: fix2(aI[0].toString(16))}, {payload: fix2(aI[1].toString(16))}, {payload: fix2(aI[2].toString(16))}, {payload: fix2(aI[3].toString(16))}, {payload: fix2(aI[4].toString(16))}, {payload: fix2(aI[5].toString(16))}, {payload: fix2(aI[6].toString(16))}, {payload: fix2(mustXor.toString(16))}]); } else { //xor error node.status({fill:"red",shape:"dot",text:'XOR error'}) node.send([null,null,null,null,null,null,null,{payload: 'XOR error'}]); }Jetzt wird an allen Ausgängen ein 2stelliger String ausgegeben.
Edit: geht auch etwas kürzer s.o. und diesmal ohne Copy/Paste Fehler –hoffe ich ;-)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden