tag:forum.selfhtml.org,2005:/self
Javascript Buffer-Daten ändern? – SELFHTML-Forum
2018-10-12T07:52:48Z
https://forum.selfhtml.org/self/2018/oct/11/javascript-buffer-daten-aendern/1733966#m1733966
Klaus1
2018-10-11T11:53:10Z
2018-10-11T11:53:10Z
Javascript Buffer-Daten ändern?
<p>Hallo,</p>
<p>kann ich nachträglich die Daten eines Buffers ändern?</p>
<p>Den Buffer habe ich bspw. wie folgt erzeugt:</p>
<pre><code class="block language-javascript"><span class="token keyword">var</span> buffer <span class="token operator">=</span> Buffer<span class="token punctuation">.</span><span class="token function">alloc</span><span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xA0"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xB1"</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xC2"</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xD3"</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xE4"</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0xF5"</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0x1A"</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0x2A"</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span><span class="token string">"0x3A"</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Jetzt möchte ich den Inhalt des Buffers nochmal ändern.
Kann ich jetzt bspw. der Reihe nach bei jedem "Feld" plus eins rechnen?</p>
<p>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.</p>
<pre><code class="block language-javascript">a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">...</span>buffer<span class="token punctuation">]</span><span class="token punctuation">;</span>
a2 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>a<span class="token punctuation">.</span>length<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
neuerWert <span class="token operator">=</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// Neuen Wert berechnen</span>
a2<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>neuerWert<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
buffer <span class="token operator">=</span> Buffer<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>a2<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>Aber das scheint nicht wirklich so richtig zu sein.</p>
<p>LG Klaus</p>
https://forum.selfhtml.org/self/2018/oct/11/javascript-buffer-daten-aendern/1733968#m1733968
Klaus1
2018-10-11T12:28:08Z
2018-10-11T12:28:08Z
Javascript Buffer-Daten ändern?
<p>Was leider auch nicht funktioniert:</p>
<pre><code class="block language-javascript">a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">...</span>buffer<span class="token punctuation">]</span><span class="token punctuation">;</span>
buf2 <span class="token operator">=</span> Buffer<span class="token punctuation">.</span><span class="token function">alloc</span><span class="token punctuation">(</span>buffer<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span>a<span class="token punctuation">.</span>length<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
neuerWert <span class="token operator">=</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// Neuen Wert berechnen</span>
buf2<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span>neuerWert<span class="token punctuation">,</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>LG Klaus</p>
https://forum.selfhtml.org/self/2018/oct/11/javascript-buffer-daten-aendern/1733997#m1733997
Rolf B
2018-10-11T15:36:59Z
2018-10-11T15:36:59Z
Javascript Buffer-Daten ändern?
<p>Hallo Klaus1,</p>
<p>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.</p>
<pre><code class="block language-js"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span>buffer<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">let</span> w <span class="token operator">=</span> buffer<span class="token punctuation">.</span><span class="token function">readUInt8</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span>w<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>oder</p>
<pre><code class="block language-js"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span>buffer<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
buffer<span class="token punctuation">.</span><span class="token function">writeUInt8</span><span class="token punctuation">(</span>buffer<span class="token punctuation">.</span><span class="token function">readUInt8</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
<p>oder</p>
<pre><code class="block language-js"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator"><</span>buffer<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
buffer<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">++</span><span class="token punctuation">;</span>
</code></pre>
<p>ich habe kein Node da, aber <a href="https://nodejs.org/api/buffer.html#buffer_buf_index" rel="nofollow noopener noreferrer">der hier</a> sagt, dass der Buffer die Uint8Array Semantik übernimmt. Also müsste das gehen.</p>
<p>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 <code>buffer.writeUInt8(0xA0, 0)</code> aufrufen. Oder <code>buffer[0] = 0xA0</code>;</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2018/oct/11/javascript-buffer-daten-aendern/1734020#m1734020
pl
2018-10-12T07:52:48Z
2018-10-12T07:52:48Z
Javascript Buffer-Daten ändern?
<p>über die Methoden einer DataView Instanz kannst Du das machen, MfG</p>
https://forum.selfhtml.org/self/2018/oct/11/javascript-buffer-daten-aendern/1733998#m1733998
Rolf B
2018-10-11T15:37:38Z
2018-10-11T15:37:38Z
Javascript Buffer-Daten ändern?
<p>Hallo Klaus1,</p>
<p>kennst Du den Unterschied zwischen Addition und Multiplikation?</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>