<?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[Blockpadding mit Strings]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe hier einen Code der String auf eine bestimmte Größe bringt. -&gt; Blockpadding. Zur Funktionsweise: Ein String von zum 10 zeichen muss auf eine Blockgrösse von 128-Bit (Stringlänge muss durch 16 teilbar sein) gebracht werden. Das heißt man füllt ihn auf mit den fehlenden 6 Zeichen. Zum Auffüllen werden 0 benutzen und die letzte Zahl(einstellig oder zweistellig) gibt die Anzahl der Füllbytes an.</p>
<p>Jetzt tut der Code auch eigentlich genau dieses, aber es kommt mir so vor als könnte man etwas an ihm pfeilen bzw. optimieren.</p>
<p>Würde mir wohl jemand dabei behilflich sein ?</p>
<p>Hier der Code ...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#include &lt;mbstring.h&gt;  /* Gibt's die nur im MS-VC++ ??? */

/* gibt die Grösse des Blockpaddings zurück */
inline unsigned int __fastcall len_with_padding(unsigned len, int blocksize) {

	if (!(len % blocksize)) return len;  

	return (len + (blocksize - ( len % blocksize)));
}

/* füllt den String &quot;out&quot; auf */
unsigned int str_blockpadding(const unsigned char *in, unsigned char *out, unsigned int len, int blocksize) {

	register int i, lenZero;
	unsigned int padlen  = (len_with_padding(len,blocksize) - len);
	unsigned int padZero;

	if (padlen &gt; 8) { padZero = padlen - 1; } else { padZero = padlen; }

	cout &lt;&lt; &quot;padlen: &quot; &lt;&lt; padlen &lt;&lt; endl &lt;&lt; &quot;padZero: &quot; &lt;&lt; padZero &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;

	memcpy(out, in, len);

	if (padlen != 0) {

		for (i = 0; i &lt; (padZero - 1); i++) { 

			sprintf((char*)out + (len + i), &quot;%d&quot;, 0);
			lenZero = i + 1;

		}

		sprintf((char*)out + (len + lenZero), &quot;%d&quot;, padlen);

	}

	return padlen;

}

int main(void) {

	int padlen;
	unsigned char in[] = &quot;Schönen Guzen Tag auch&quot;;

	padlen = len_with_padding(_mbslen(in), 16);

	unsigned char *out = new unsigned char[padlen];

	cout &lt;&lt; &quot;Funktionsrückgabe : &quot; &lt;&lt; str_blockpadding(in, out, _mbslen(in), 16) &lt;&lt; endl &lt;&lt; endl;

	out[padlen] = '\0';

	cout &lt;&lt; &quot;Neuer String: &quot; &lt;&lt; out &lt;&lt; endl &lt;&lt; endl;

	cout &lt;&lt; &quot;Länge von in : &quot; &lt;&lt; _mbslen(in) &lt;&lt; endl &lt;&lt; &quot;Länge von out: &quot; &lt;&lt; _mbslen(out) &lt;&lt; endl &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>P.S.: Habe es nicht im C++ Forum gepostet da ich die Header Datei &lt;mbstring.h&gt; benutze und die ist imho nur im MS-VC++ zu Hause.</p>
<p>P.P.S.: Die Funktion str_blockpadding ruft im Release nicht zusätzlich die Funktion len_with_padding auf. Dafür gibt es dann einen zusätzlichen Funktionsparameter. Habe ich jtzt nur der Übersichtlichkeit gemacht.</p>
<p><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/topic/52688/blockpadding-mit-strings</link><generator>RSS for Node</generator><lastBuildDate>Mon, 01 Jun 2026 02:37:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/52688.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Oct 2003 11:57:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 11:57:52 GMT]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe hier einen Code der String auf eine bestimmte Größe bringt. -&gt; Blockpadding. Zur Funktionsweise: Ein String von zum 10 zeichen muss auf eine Blockgrösse von 128-Bit (Stringlänge muss durch 16 teilbar sein) gebracht werden. Das heißt man füllt ihn auf mit den fehlenden 6 Zeichen. Zum Auffüllen werden 0 benutzen und die letzte Zahl(einstellig oder zweistellig) gibt die Anzahl der Füllbytes an.</p>
<p>Jetzt tut der Code auch eigentlich genau dieses, aber es kommt mir so vor als könnte man etwas an ihm pfeilen bzw. optimieren.</p>
<p>Würde mir wohl jemand dabei behilflich sein ?</p>
<p>Hier der Code ...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

#include &lt;mbstring.h&gt;  /* Gibt's die nur im MS-VC++ ??? */

/* gibt die Grösse des Blockpaddings zurück */
inline unsigned int __fastcall len_with_padding(unsigned len, int blocksize) {

	if (!(len % blocksize)) return len;  

	return (len + (blocksize - ( len % blocksize)));
}

/* füllt den String &quot;out&quot; auf */
unsigned int str_blockpadding(const unsigned char *in, unsigned char *out, unsigned int len, int blocksize) {

	register int i, lenZero;
	unsigned int padlen  = (len_with_padding(len,blocksize) - len);
	unsigned int padZero;

	if (padlen &gt; 8) { padZero = padlen - 1; } else { padZero = padlen; }

	cout &lt;&lt; &quot;padlen: &quot; &lt;&lt; padlen &lt;&lt; endl &lt;&lt; &quot;padZero: &quot; &lt;&lt; padZero &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;

	memcpy(out, in, len);

	if (padlen != 0) {

		for (i = 0; i &lt; (padZero - 1); i++) { 

			sprintf((char*)out + (len + i), &quot;%d&quot;, 0);
			lenZero = i + 1;

		}

		sprintf((char*)out + (len + lenZero), &quot;%d&quot;, padlen);

	}

	return padlen;

}

int main(void) {

	int padlen;
	unsigned char in[] = &quot;Schönen Guzen Tag auch&quot;;

	padlen = len_with_padding(_mbslen(in), 16);

	unsigned char *out = new unsigned char[padlen];

	cout &lt;&lt; &quot;Funktionsrückgabe : &quot; &lt;&lt; str_blockpadding(in, out, _mbslen(in), 16) &lt;&lt; endl &lt;&lt; endl;

	out[padlen] = '\0';

	cout &lt;&lt; &quot;Neuer String: &quot; &lt;&lt; out &lt;&lt; endl &lt;&lt; endl;

	cout &lt;&lt; &quot;Länge von in : &quot; &lt;&lt; _mbslen(in) &lt;&lt; endl &lt;&lt; &quot;Länge von out: &quot; &lt;&lt; _mbslen(out) &lt;&lt; endl &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>P.S.: Habe es nicht im C++ Forum gepostet da ich die Header Datei &lt;mbstring.h&gt; benutze und die ist imho nur im MS-VC++ zu Hause.</p>
<p>P.P.S.: Die Funktion str_blockpadding ruft im Release nicht zusätzlich die Funktion len_with_padding auf. Dafür gibt es dann einen zusätzlichen Funktionsparameter. Habe ich jtzt nur der Übersichtlichkeit gemacht.</p>
<p><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/377196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377196</guid><dc:creator><![CDATA[Michael__W.]]></dc:creator><pubDate>Wed, 22 Oct 2003 11:57:52 GMT</pubDate></item><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 13:28:48 GMT]]></title><description><![CDATA[<p>a) padlen:</p>
<pre><code class="language-cpp">unsigned int len_with_padding(unsigned len, int blocksize) 
{ 
  len = len + blocksize - 1;
  return len - (len % blocksize);
} 

// oder noch schneller - aber nur wenn blocksize eine zweierpotenz ist
unsigned int len_with_padding(unsigned len, int blocksize) 
{ 
  blocksize -= 1;
  return (len + blocksize) &amp; ~(blocksize);
}
</code></pre>
<pre><code class="language-cpp">unsigned int str_blockpadding(const unsigned char *in, unsigned char *out, unsigned int len, int blocksize) { 

    int i, lenZero; 
    unsigned int padlen  = (len_with_padding(len,blocksize) - len); 

    memcpy(out, in, len);
    if (padlen &gt; 0)
    {
       int padzero = padlen-1;   // ähnliche rechnung wie bei dir - glaub ich
       if (padlen &gt;= 10) 
         --padzero;            

       out += len;
       if (padzero)
       {   // (1) memset instead of repeated sprintf:
          memset(out+len, '0', padzero);  // mit 0 füllen
          out += padzero;
       }

       // (2) &quot;custom itoa&quot; instead of sprintf:

       // if you have you can use _itoa(padlen, out+len+padzero, 10); 
       // or - for ANSI compatibility - 
       if (padlen &gt;= 10)
         *out++ = '0' + (padlen/10);

       *out++ = '0' + (padlen % 10);
    }

    return padlen; 
}
</code></pre>
<p>Unter vorbehalt von Obi-Ones.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/377341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377341</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Wed, 22 Oct 2003 13:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 14:31:28 GMT]]></title><description><![CDATA[<p>Super. Herzlichen Dank, das sieht schon einmal ganz gut aus. Aber ein paar Fragen hätte ich da noch ...</p>
<p>peterchen schrieb:</p>
<blockquote>
<p>a) padlen:</p>
</blockquote>
<p>Ja. Eigentlich ist 16 doch eine Zweierpotenz. 8 auch, da ich auch &quot;8ter&quot; Blockpadding brauche. Oder irre ich mich da jetzt ?<br />
Hier verstehe ich allerdings nicht den theoretischen Teil, wie man durch Bitmanipulation extrem effizient rechnet wie z.B. auch * und / mit 2er-Potenzen.</p>
<p>Den b)-Teil verstehe ich allerdings nicht ganz. Mit memset ist klar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /> Hätte ich auch selber drauf kommen können. Aber die _itoa Funktion (ya' i have) kann ich nicht ganz nachvollziehen. Habe auch schon in der MSDN &quot;geblättert&quot;.</p>
<p>Trotzdem ersteinmal &quot;Besten Dank&quot; <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/377414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377414</guid><dc:creator><![CDATA[Michael__W.]]></dc:creator><pubDate>Wed, 22 Oct 2003 14:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 14:42:35 GMT]]></title><description><![CDATA[<p>a) ja - alles was 2^n ist (2, 4, 8, 16, 32, 64, 128, 256, ...)</p>
<p>Kurzübersicht:<br />
x &gt;&gt; n = (x / (2^n))<br />
x &lt;&lt; n = (x * (2^n))</p>
<p>x &amp; (2^n-1) == x % 2^n<br />
x &amp; ~(2^n-1) == x - x(x % 2^n)</p>
<p>x |= 1 == if ((x%2)==0) ++x</p>
<p>----------<br />
ich versuch', das sprintf durch was einfacheres zu ersetzten.<br />
MSVC kennt _itoa (viele compiler haben ähnliches, nur ist im ANSI-Standard glaub ich nix dabei)</p>
<p>Mit den letzten modifikationen (out &quot;weiterrücken&quot;) wäre das natürlich _itoa(padlen, out, 10) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Die Hand-Implementierung (geht von einem zeichensatz aus, bei dem die Ziffern sequentiell liegen, ist also nicht über-portabel):</p>
<p>- wenn padlen &gt;= 10 (zwei ziffrig),<br />
padlen/10 ==&gt; erste Ziffer (0..9, hofft man)<br />
+'0' (addiert code von '0', so das man - mit obiger annahme - das entsprechende Ziffernzeichen erhält)</p>
<p>das gleiche noch mal für den rest (padlen%10)</p>
<p>HTH</p>
]]></description><link>https://www.c-plusplus.net/forum/post/377437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377437</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Wed, 22 Oct 2003 14:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 14:58:33 GMT]]></title><description><![CDATA[<p>peterchen schrieb:</p>
<blockquote>
<p>Mit den letzten modifikationen (out &quot;weiterrücken&quot;) wäre das natürlich _itoa(padlen, out, 10)</p>
</blockquote>
<p>Hmm. Theoretisch könnte man auch wieder ein memset nutzen mit if, je nachdem ob das Padding zwei-/einstellig ist, ne ?<br />
Erscheint mir immernoch sicherer besser gesagt klarer als ein gewagtes _itoa bzw. die portable Handimplementierung.</p>
<p>P.S.: Portabel muss es ja nicht sein. Soll ja als gelinktes Kompilat herausgehen. <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/377456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377456</guid><dc:creator><![CDATA[Michael__W.]]></dc:creator><pubDate>Wed, 22 Oct 2003 14:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Blockpadding mit Strings on Wed, 22 Oct 2003 15:12:23 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Theoretisch könnte man auch wieder ein memset nutzen mit if, je nachdem ob das Padding zwei-/einstellig ist, ne ?</p>
</blockquote>
<p>nee, da mußte das ja die Zahl wieder genauso auseinandernehmen. Das memset lohnt sich nur, wenn du mehrere bytes hintereinander auf den gleichen Wert setzt. Ansonsten halt das out[index] = ... (bzw. *out++=)</p>
<p>Im endeffekt ist ein sprintf hier die portable lösung und nicht sooo schlimm (es sei denn du machst das 10.000 mal hinterienander)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/377473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/377473</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Wed, 22 Oct 2003 15:12:23 GMT</pubDate></item></channel></rss>