<?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[UNCIDOE string verschlüsseln]]></title><description><![CDATA[<p>Hi zusammen,<br />
ich bin dabei einen string zu verschlüsseln.<br />
Da der String aus UNICODE zeichen bestehen kann, habe ich alle Zeichen entsprechend definiert:</p>
<p>Nun möchte ich meinen String codieren bzw. decodieren, dafür habe ich einen Code im Netz gefunden:</p>
<p>Ich rufe die Kodierung wie folgt auf:</p>
<pre><code>#ifdef UNICODE
       #define cout wcout
       #define tstring wstring
       #define _TUCHAR wchar_t
#else
       #define cout cout
       #define tstring string
       #define _TUCHAR unsigned char 
#endif

const std::tstring s = klartext;
std::tstring encoded = base64_encode(reinterpret_cast&lt;const _TUCHAR*&gt;(s.c_str()), s.length());
</code></pre>
<p><strong>base64.cpp</strong></p>
<pre><code>static const std::tstring base64_chars = 
             &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;
             &quot;abcdefghijklmnopqrstuvwxyz&quot;
             &quot;0123456789+/&quot;;

static inline bool is_base64(_TUCHAR c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}

std::tstring base64_encode(_TUCHAR const* bytes_to_encode, unsigned int in_len) {
  std::tstring ret;
  int i = 0;
  int j = 0;
  _TUCHAR char_array_3[3];
  _TUCHAR char_array_4[4];

  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] &amp; 0xfc) &gt;&gt; 2;
      char_array_4[1] = ((char_array_3[0] &amp; 0x03) &lt;&lt; 4) + ((char_array_3[1] &amp; 0xf0) &gt;&gt; 4);
      char_array_4[2] = ((char_array_3[1] &amp; 0x0f) &lt;&lt; 2) + ((char_array_3[2] &amp; 0xc0) &gt;&gt; 6);
      char_array_4[3] = char_array_3[2] &amp; 0x3f;

      for(i = 0; (i &lt;4) ; i++)
        ret += base64_chars[char_array_4[i&rsqb;&rsqb;;
      i = 0;
    }
  }

  if (i)
  {
    for(j = i; j &lt; 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] &amp; 0xfc) &gt;&gt; 2;
    char_array_4[1] = ((char_array_3[0] &amp; 0x03) &lt;&lt; 4) + ((char_array_3[1] &amp; 0xf0) &gt;&gt; 4);
    char_array_4[2] = ((char_array_3[1] &amp; 0x0f) &lt;&lt; 2) + ((char_array_3[2] &amp; 0xc0) &gt;&gt; 6);
    char_array_4[3] = char_array_3[2] &amp; 0x3f;

    for (j = 0; (j &lt; i + 1); j++)
      ret += base64_chars[char_array_4[j&rsqb;&rsqb;;

    while((i++ &lt; 3))
      ret += '=';

  }

  return ret;

}

std::tstring base64_decode(std::tstring const&amp; encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  _TUCHAR char_array_4[4], char_array_3[3];
  std::tstring ret;

  while (in_len-- &amp;&amp; ( encoded_string[in_] != '=') &amp;&amp; is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i &lt;4; i++){
        char_array_4[i] = base64_chars.find(char_array_4[i]);
      }

      char_array_3[0] = (char_array_4[0] &lt;&lt; 2) + ((char_array_4[1] &amp; 0x30) &gt;&gt; 4);
      char_array_3[1] = ((char_array_4[1] &amp; 0xf) &lt;&lt; 4) + ((char_array_4[2] &amp; 0x3c) &gt;&gt; 2);
      char_array_3[2] = ((char_array_4[2] &amp; 0x3) &lt;&lt; 6) + char_array_4[3];

      for (i = 0; (i &lt; 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j &lt;4; j++)
      char_array_4[j] = 0;

    for (j = 0; j &lt;4; j++){
        char_array_4[j] = base64_chars.find(char_array_4[j]);
    }

    char_array_3[0] = (char_array_4[0] &lt;&lt; 2) + ((char_array_4[1] &amp; 0x30) &gt;&gt; 4);
    char_array_3[1] = ((char_array_4[1] &amp; 0xf) &lt;&lt; 4) + ((char_array_4[2] &amp; 0x3c) &gt;&gt; 2);
    char_array_3[2] = ((char_array_4[2] &amp; 0x3) &lt;&lt; 6) + char_array_4[3];

    for (j = 0; (j &lt; i - 1); j++) ret += char_array_3[j];
  }

  return ret;
}
</code></pre>
<p>So,<br />
das alles funktioniert ja wunderbar (bei meinem lokalen System) aber nun frag ich mich wie ich das für einen String aus UNCODE Zeichen funktioniert. Also ich kann ja nicht alle UNICODE zeichen in base64_chars eintragen!?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277696/uncidoe-string-verschlüsseln</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 20:06:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277696.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Nov 2010 08:19:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 08:19:31 GMT]]></title><description><![CDATA[<p>Hi zusammen,<br />
ich bin dabei einen string zu verschlüsseln.<br />
Da der String aus UNICODE zeichen bestehen kann, habe ich alle Zeichen entsprechend definiert:</p>
<p>Nun möchte ich meinen String codieren bzw. decodieren, dafür habe ich einen Code im Netz gefunden:</p>
<p>Ich rufe die Kodierung wie folgt auf:</p>
<pre><code>#ifdef UNICODE
       #define cout wcout
       #define tstring wstring
       #define _TUCHAR wchar_t
#else
       #define cout cout
       #define tstring string
       #define _TUCHAR unsigned char 
#endif

const std::tstring s = klartext;
std::tstring encoded = base64_encode(reinterpret_cast&lt;const _TUCHAR*&gt;(s.c_str()), s.length());
</code></pre>
<p><strong>base64.cpp</strong></p>
<pre><code>static const std::tstring base64_chars = 
             &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;
             &quot;abcdefghijklmnopqrstuvwxyz&quot;
             &quot;0123456789+/&quot;;

static inline bool is_base64(_TUCHAR c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}

std::tstring base64_encode(_TUCHAR const* bytes_to_encode, unsigned int in_len) {
  std::tstring ret;
  int i = 0;
  int j = 0;
  _TUCHAR char_array_3[3];
  _TUCHAR char_array_4[4];

  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] &amp; 0xfc) &gt;&gt; 2;
      char_array_4[1] = ((char_array_3[0] &amp; 0x03) &lt;&lt; 4) + ((char_array_3[1] &amp; 0xf0) &gt;&gt; 4);
      char_array_4[2] = ((char_array_3[1] &amp; 0x0f) &lt;&lt; 2) + ((char_array_3[2] &amp; 0xc0) &gt;&gt; 6);
      char_array_4[3] = char_array_3[2] &amp; 0x3f;

      for(i = 0; (i &lt;4) ; i++)
        ret += base64_chars[char_array_4[i&rsqb;&rsqb;;
      i = 0;
    }
  }

  if (i)
  {
    for(j = i; j &lt; 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] &amp; 0xfc) &gt;&gt; 2;
    char_array_4[1] = ((char_array_3[0] &amp; 0x03) &lt;&lt; 4) + ((char_array_3[1] &amp; 0xf0) &gt;&gt; 4);
    char_array_4[2] = ((char_array_3[1] &amp; 0x0f) &lt;&lt; 2) + ((char_array_3[2] &amp; 0xc0) &gt;&gt; 6);
    char_array_4[3] = char_array_3[2] &amp; 0x3f;

    for (j = 0; (j &lt; i + 1); j++)
      ret += base64_chars[char_array_4[j&rsqb;&rsqb;;

    while((i++ &lt; 3))
      ret += '=';

  }

  return ret;

}

std::tstring base64_decode(std::tstring const&amp; encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  _TUCHAR char_array_4[4], char_array_3[3];
  std::tstring ret;

  while (in_len-- &amp;&amp; ( encoded_string[in_] != '=') &amp;&amp; is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i &lt;4; i++){
        char_array_4[i] = base64_chars.find(char_array_4[i]);
      }

      char_array_3[0] = (char_array_4[0] &lt;&lt; 2) + ((char_array_4[1] &amp; 0x30) &gt;&gt; 4);
      char_array_3[1] = ((char_array_4[1] &amp; 0xf) &lt;&lt; 4) + ((char_array_4[2] &amp; 0x3c) &gt;&gt; 2);
      char_array_3[2] = ((char_array_4[2] &amp; 0x3) &lt;&lt; 6) + char_array_4[3];

      for (i = 0; (i &lt; 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j &lt;4; j++)
      char_array_4[j] = 0;

    for (j = 0; j &lt;4; j++){
        char_array_4[j] = base64_chars.find(char_array_4[j]);
    }

    char_array_3[0] = (char_array_4[0] &lt;&lt; 2) + ((char_array_4[1] &amp; 0x30) &gt;&gt; 4);
    char_array_3[1] = ((char_array_4[1] &amp; 0xf) &lt;&lt; 4) + ((char_array_4[2] &amp; 0x3c) &gt;&gt; 2);
    char_array_3[2] = ((char_array_4[2] &amp; 0x3) &lt;&lt; 6) + char_array_4[3];

    for (j = 0; (j &lt; i - 1); j++) ret += char_array_3[j];
  }

  return ret;
}
</code></pre>
<p>So,<br />
das alles funktioniert ja wunderbar (bei meinem lokalen System) aber nun frag ich mich wie ich das für einen String aus UNCODE Zeichen funktioniert. Also ich kann ja nicht alle UNICODE zeichen in base64_chars eintragen!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984465</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Tue, 23 Nov 2010 08:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 08:34:24 GMT]]></title><description><![CDATA[<p>Dir ist aber bekannt, dass alle sichtbaren ASCII-Zeichen in einem Bereich liegen? Ausgehend davon könntest du mit diesen Grenzen arbeiten. Wenn du unbedingt alle Zeichen in einem String benötigst, kannst du diesen entweder zur Laufzeit erstellen oder, wenn Geschwindigkeit vor Größe geht, dir vorher generieren lassen. Du musst aber jetzt nicht mehrere tausend Zeichen von Hand eintragen, was auch sehr fehleranfällig wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984472</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Tue, 23 Nov 2010 08:34:24 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 08:50:08 GMT]]></title><description><![CDATA[<p>ok, also hier im Beispiel verwende ich den String <strong>base64_chars</strong> zum verschlüsseln.</p>
<p>Anstatt nurn wie hier diesen string zu definieren soll ich auf einen Bereich im speicher verweisen ab den die ASCII(in meinem Fall dann UNICDOE)-Zeichen definiert sind.</p>
<p>Ok, angenommen ich finde diese Speicherstelle heraus, ist diese dann zwischen unterschiedlichen systemen überhaupt identisch (untersch. OS z.B. WindowsXP VISTA oder 7)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984482</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Tue, 23 Nov 2010 08:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 09:13:07 GMT]]></title><description><![CDATA[<p>Nein, du hast das falsch verstanden. Die Zeichen in deinem base64_chars-String haben folgende Form &quot;\x41\x42\x43\44 ... \x5A&quot;, was das selbe ist wie &quot;ABCD ... Z&quot;. Wie du siehst ist A-Z nur ein Zahlenbereich von 41h bis 5Ah. Genauso verhält es sich mit den kleinen Buchstaben, Zahlen und auch den restlichen Unicode-Zeichen. Es gibt also kein Bedarf, alle Zeichen einzeln aufzuzählen. Wegen der Systemabhängigkeit brauchst du dir auch keine Gedanken machen. Die Werte sind exakt die selben, mit denen du jetzt auch arbeitest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984494</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Tue, 23 Nov 2010 09:13:07 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 12:09:17 GMT]]></title><description><![CDATA[<p>ok,<br />
habe verstanden. Vielen Dank.</p>
<p>Bin eben dabei die Klasse zu erweitern und zwar um diese Methode:</p>
<pre><code>std::tstring getBaseString(){
    TCHAR aChar = '\x21';
    TCHAR aCompleteCharArray[94];
    aCompleteCharArray[0]=aChar;
    for(int i =0; i&lt; ARRAY_SIZE(aCompleteCharArray); i++){
       aCompleteCharArray[i]=aChar;
       aChar = aChar+'\x1';
    }
    std::tstring base64_chars;
    base64_chars.assign(aCompleteCharArray, (ARRAY_SIZE(aCompleteCharArray)));
    //for(int i =0; i&lt; base64_chars.length(); i++){
    //   cout&lt;&lt;i &lt;&lt;&quot; &quot; &lt;&lt; base64_chars[i]&lt;&lt;endl;  
    //}
    return base64_chars;
}
</code></pre>
<p>Dies ist noch ein Beispiel für ASCII Zeichen. Wollte dafür einen string variabel erzeugen. Dabei werden alle Zeichen ab &quot;\x21&quot; bis &quot;\x7E&quot; verwendet.<br />
Das klappt aber schon einmal nicht. Also der String wird zwar verschlüsselt, aber nicht mehr korrekt entschlüsselt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984582</guid><dc:creator><![CDATA[redbomber]]></dc:creator><pubDate>Tue, 23 Nov 2010 12:09:17 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 12:33:03 GMT]]></title><description><![CDATA[<p>Ich kenne diesen tstring nicht, auch deine anderen Typen sind mir nicht geläufig. Aber willst du nicht nur einfach so was machen?</p>
<pre><code class="language-cpp">std::string getBaseString()
{
    std:string basestring;

    for (char character = '!'; character &lt;= '~'; ++character)
    {
	basestring += character;
    }
    return basestring;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984592</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Tue, 23 Nov 2010 12:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 14:12:16 GMT]]></title><description><![CDATA[<p>Nick Unbekannt schrieb:</p>
<blockquote>
<p>Ich kenne diesen tstring nicht, auch deine anderen Typen sind mir nicht geläufig. Aber willst du nicht nur einfach so was machen?</p>
</blockquote>
<pre><code class="language-cpp">#ifdef UNICODE
       #define cout wcout
       #define tstring wstring
       #define _TUCHAR wchar_t
#else
       #define cout cout
       #define tstring string
       #define _TUCHAR unsigned char
#endif
</code></pre>
<p>da stehts <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="😉"
    /></p>
<p>@TO: kennst <code>_TCHAR</code> nicht?</p>
<pre><code class="language-cpp">typedef std::basic_string&lt;_TCHAR&gt; string_t;
//typedef _TCHAR _TUCHAR;
</code></pre>
<p>für cout / wcout weiß ich auch keine bessere möglichkeit als die hässlichen makros - aber vll weiß da jmd anderes ja mehr <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="😉"
    /></p>
<p>könnt mir höchstens noch so was vorstellen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct types;

template &lt;&gt;
struct types &lt;char&gt;
{
  typedef char value_type;
  typedef std::string string_t;

  static std::ostream&amp; out;
};
std::ostream&amp; types&lt;char&gt;::out = std::cout;

template &lt;&gt;
struct types &lt;wchar_t&gt;
{
  typedef wchar_t value_type;
  typedef std::wstring string_t;

  static std::wostream&amp; out;
}
std::wostream&amp; types&lt;wchar_t&gt;::out = std::wcout;

int main()
{
  types&lt;_TCHAR&gt;::string_t asd = _T(&quot;asd&quot;);

  types&lt;_TCHAR&gt;::out &lt;&lt; asd;
}
</code></pre>
<p>aber so richtig toll find ichs auch nicht...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984644</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 23 Nov 2010 14:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to UNCIDOE string verschlüsseln on Tue, 23 Nov 2010 14:27:33 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>da stehts <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="😉"
    /></p>
</blockquote>
<p>Ich hab mir am Anfang schon gedacht, wenn will er den mit seinen Umdefinierungen von cout verwirren. Und jetzt hab ich das Opfer gefunden. <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="😉"
    /><br />
Das ist aber auch zu verwirrend, wenn dann sein eigener tstring auch noch plötzlich im std-Namespace steckt.<br />
Für den Outputstream würde ich einfach einen typedef abhängig von UNICODE machen.</p>
<pre><code class="language-cpp">#ifdef UNICODE
typedef std::wcout mycout;
#else
typedef std::cout mycout;
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984650</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Tue, 23 Nov 2010 14:27:33 GMT</pubDate></item></channel></rss>