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.
-
Versuch mal````
{payload: mustXor.toString(16).padStart(2, '0')}Fall du alle Ausgänge als hex 2stellig haben willst, dann musst du das .toString(16).padStart(2, '0') überall anhängen.
-
Super. Ich danke dir für die Unterstützung, hast mir sehr geholfen. Ich probiere das morgen mal aus.
-
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