<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[direkt in std::vector schreiben (als unsigned char**)]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>kann ich einen std::vector direkt in eine Funktion einstzen, dessen Parameter ein 'unsigned char**' erwartet?</p>
<pre><code>int size = getSize(...);
std::vector&lt;unsigned char&gt; storage(size);
unsigned char *temp = storage.data();
eineFunktion(&amp;temp);
</code></pre>
<p>Das oben genannte Beispiel funktioniert so erstmal. getSize() ist eine einfache Funktion, welche die benötige Speichergröße zurückgibt. Die Funktion 'eineFunktion(unsigned char** ppBuffer)' schreibt dann irgendwelche Daten in den Puffer. Momentan mache ich dies über den Umweg mit der Variable 'temp'. Kann ich das besser zusammenfassen? Die beiden genannten Funktionen sind extern und nicht änderbar.</p>
<p>prinzipiell hätte ich also gerne so etwas:</p>
<pre><code>int size = getSize(...);
std::vector&lt;unsigned char&gt; storage(size);
eineFunktion(&amp;storage.data());  //error: lvalue required as unary ‘&amp;’ operand
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337866/direkt-in-std-vector-schreiben-als-unsigned-char</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 16:43:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337866.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 May 2016 14:51:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 14:51:26 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>kann ich einen std::vector direkt in eine Funktion einstzen, dessen Parameter ein 'unsigned char**' erwartet?</p>
<pre><code>int size = getSize(...);
std::vector&lt;unsigned char&gt; storage(size);
unsigned char *temp = storage.data();
eineFunktion(&amp;temp);
</code></pre>
<p>Das oben genannte Beispiel funktioniert so erstmal. getSize() ist eine einfache Funktion, welche die benötige Speichergröße zurückgibt. Die Funktion 'eineFunktion(unsigned char** ppBuffer)' schreibt dann irgendwelche Daten in den Puffer. Momentan mache ich dies über den Umweg mit der Variable 'temp'. Kann ich das besser zusammenfassen? Die beiden genannten Funktionen sind extern und nicht änderbar.</p>
<p>prinzipiell hätte ich also gerne so etwas:</p>
<pre><code>int size = getSize(...);
std::vector&lt;unsigned char&gt; storage(size);
eineFunktion(&amp;storage.data());  //error: lvalue required as unary ‘&amp;’ operand
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495059</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 06 May 2016 14:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 15:21:03 GMT]]></title><description><![CDATA[<p>Wozu braucht die Funktion char**? Das ist entweder dämlich implementiert oder macht etwas anderes als du denkst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495060</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 06 May 2016 15:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 15:37:41 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Wozu braucht die Funktion char**? Das ist entweder dämlich implementiert oder macht etwas anderes als du denkst.</p>
</blockquote>
<p>Konkret handelt es sich um diese OpenSSL-Funktion:</p>
<pre><code>int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp);
</code></pre>
<p>Der Rückgabewert ist die Größe der Daten, die zu kopieren sind. Der erste Parameter ist die Quellstruktur und der 2. Parameter das Ziel, in dem die Daten kopiert werden soll. Das ist in OpenSSL ein gängiges Schema. Man kann den 2. Parameter auf nullptr setzen, wenn man nur die Größe der Daten wissen will.</p>
<p>Das führt so zu solchem code:</p>
<pre><code>int size = i2d_PublicKey(pKey, nullptr);
if (size &lt; 0)
    throw irgendwas;

std::vector&lt;unsigned char&gt; storage(size);
unsigned char *temp = storage.data();
i2d_PublicKey(pKey, &amp;temp);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2495064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495064</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 06 May 2016 15:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 15:51:51 GMT]]></title><description><![CDATA[<p>Du hast die Frage nicht beantwortet. ** braucht die Funktion nur, wenn sie den Puffer selbst bereit stellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495065</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 06 May 2016 15:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 16:25:55 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Du hast die Frage nicht beantwortet. ** braucht die Funktion nur, wenn sie den Puffer selbst bereit stellt.</p>
</blockquote>
<p>den Puffer stellt die Funktion nicht zur Verfügung (da bin ich mir sehr sicher). Ansonsten hätte als Parameter ein einfaches * gereicht.</p>
<p>Hier ist mal die Orginalbeschreibung von diesen Funktionen (diese gibt es für verschiedene Typen, sind aber von der Funktionsweise identisch):</p>
<pre><code>int i2d_X509(X509 *x, unsigned char **out);
</code></pre>
<blockquote>
<p>i2d_X509() encodes the structure pointed to by x into DER format. If out is not NULL is writes the DER encoded data to the buffer at *out, and increments it to point after the data just written. If the return value is negative an error occurred, otherwise it returns the length of the encoded data.</p>
</blockquote>
<p><a href="https://www.openssl.org/docs/manmaster/crypto/d2i_X509.html" rel="nofollow">https://www.openssl.org/docs/manmaster/crypto/d2i_X509.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495071</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 06 May 2016 16:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 16:48:37 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Ansonsten hätte als Parameter ein einfaches * gereicht</p>
</blockquote>
<p>Nein, eben nicht.</p>
<blockquote>
<p>i2d_X509() encodes the structure pointed to by x into DER format. If out is not NULL is writes the DER encoded data to the buffer at *out, and increments it to point after the data just written. If the return value is negative an error occurred, otherwise it returns the length of the encoded data.</p>
</blockquote>
<p>Aha, der Pointer wird geändert und zeigt hinter die kopierten Daten. Dann sollte deine Lösung mit temp funktionieren, wenn der Vector groß genug ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495077</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 06 May 2016 16:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to direkt in std::vector schreiben (als unsigned char**) on Fri, 06 May 2016 18:11:54 GMT]]></title><description><![CDATA[<p>Stimmt du hat ja Recht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Mein Fehler. Das hatte ich ja ganz verdrängt. Ja der Pointer wird natürlich geändert. ...ich dussel.</p>
<p>vielen Dank, dass du mich wieder wachgerüttelt hast. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2495083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2495083</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 06 May 2016 18:11:54 GMT</pubDate></item></channel></rss>