Klaus1: Javascript Buffer-Daten ändern?

Hallo,

kann ich nachträglich die Daten eines Buffers ändern?

Den Buffer habe ich bspw. wie folgt erzeugt:

var buffer = Buffer.alloc(9);
buffer.writeUInt8("0xA0",0);
buffer.writeUInt8("0xB1",1);
buffer.writeUInt8("0xC2",2);
buffer.writeUInt8("0xD3",3);
buffer.writeUInt8("0xE4",4);
buffer.writeUInt8("0xF5",5);
buffer.writeUInt8("0x1A",6);
buffer.writeUInt8("0x2A",7);
buffer.writeUInt8("0x3A",8);

Jetzt möchte ich den Inhalt des Buffers nochmal ändern. Kann ich jetzt bspw. der Reihe nach bei jedem "Feld" plus eins rechnen?

Mein Ansatz ist, dass ich zunächst aus den Buffer-Daten wieder ein Array baue und dann durch das Array laufe, den Inhalt verändere und am Ende aus dem Array wieder ein Buffer mache.

a = [...buffer];
a2 = [];
for (i=0;i<a.length;i++) {
	neuerWert = a[i] * 1;		// Neuen Wert berechnen
	a2.push(neuerWert);
}
buffer = Buffer.from(a2);

Aber das scheint nicht wirklich so richtig zu sein.

LG Klaus

  1. Was leider auch nicht funktioniert:

    a = [...buffer];
    buf2 = Buffer.alloc(buffer.length);
    for (i=0;i<a.length;i++) {
    	neuerWert = a[i] * 1;		// Neuen Wert berechnen
    	buf2.writeUInt8(neuerWert,i);
    }
    
    

    LG Klaus

    1. Hallo Klaus1,

      kennst Du den Unterschied zwischen Addition und Multiplikation?

      Rolf

      --
      sumpsi - posui - clusi
  2. Hallo Klaus1,

    das ist Node.js, ja? Dessen Buffer hat eine readUInt8 Methode. Das scheint mir der richtige Weg zu sein, um einen Wert auszulesen, ihn zu ändern und zurückzuschreiben, wenn man „einen Buffer nachträglich ändern“ will. Wenn Du eine geänderte Kopie des Buffers erzeugen willst, solltest Du einen Buffer gleicher Größe anlegen und die Werte mit readUInt8 und writeUInt8 kopieren.

    for (let i=0; i<buffer.length; i++) {
       let w = buffer.readUInt8(i);
       buffer.writeUInt8(w+1, i);
    }
    

    oder

    for (let i=0; i<buffer.length; i++) 
       buffer.writeUInt8(buffer.readUInt8(i)+1, i);
    

    oder

    for (let i=0; i<buffer.length; i++) 
       buffer[i]++;
    

    ich habe kein Node da, aber der hier sagt, dass der Buffer die Uint8Array Semantik übernimmt. Also müsste das gehen.

    Ansonsten solltest Du keine undokumentierten Node-Aufrufe verwenden. In der Doku steht, dass der bei writeUInt8 übergebene Wert ein Integer sein soll. Offenbar ist Node so nett und übersetzt den String, den Du ihm einwirfst. Aber du kannst auch direkt buffer.writeUInt8(0xA0, 0) aufrufen. Oder buffer[0] = 0xA0;

    Rolf

    --
    sumpsi - posui - clusi
  3. über die Methoden einer DataView Instanz kannst Du das machen, MfG