Autor Beitrag
3marci
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 61
Erhaltene Danke: 5

Windows 7 / Kubuntu 11.04
C# / vb.net / php / progress (VS 2010 Express / SharpDevelop / NetBeans / proAlpha)
BeitragVerfasst: Sa 12.03.11 22:53 
Hi Leute,

hab mal ne Frage, da ich gerade an einem Algorithmus für eine "Leetspeak Verschlüsselung" sitze die möglichst sinnvoll sein soll (für die die Leetspeak nicht kennen -> Wikipedia).
Ja, ich weiß... Google gibt jede menge Treffer wenn man nach "csharp leetspeak" sucht aus.
Die machen das aber alles mit zwei Buttons, einen zum verschlüsseln und einen zum entschlüsseln und ich dachte mir das muss doch einfacher gehen.
Eine Leetspeak Verschlüsselung mit einem Button!? Meine Klasse sieht bisher so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        private Dictionary<charchar> charDict = new Dictionary<charchar>();

        public Leetspeak()
        {
            charDict.Add('a''4');
            charDict.Add('4''a');

            charDict.Add('b''8');
            charDict.Add('8''b');

            // etc...
        }

        public string Convert(string sText)
        {
            StringBuilder sBuilder = new StringBuilder(sText);
            charDict.Keys.ToList().ForEach(key => sBuilder.Replace(key, charDict[key]));
            return sBuilder.ToString();
        }

Das ganze soll aus jedem "a" eine "4" und aus jeder 4 ein a machen.
Leider macht er aus jedem a eine 4 und nimmt dann wieder die 4 und macht daraus ein a, kurz gesagt: es bleibt ein a.
Gibt es eine Möglichkeit, dass wenn er ein Char ersetzt hat diesen Char nicht mehr ersetzt, sondern gleich mit dem nächsten Zeichen weiter macht?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 13.03.11 10:31 
Hallo,

da wirst du die internen Schleifen wohl umdrehen müssen, d.h. zuerst über die einzelnen Zeichen des Textes iterieren und dann jeweils pro Zeichen das passende Zeichen im Dictionary nehmen (falls vorhanden). Und dann für den "Leetspeak"-Text einen StringBuilder nehmen (da dieser effizienter als ein += bei einem String ist).
3marci Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 61
Erhaltene Danke: 5

Windows 7 / Kubuntu 11.04
C# / vb.net / php / progress (VS 2010 Express / SharpDevelop / NetBeans / proAlpha)
BeitragVerfasst: So 13.03.11 19:39 
thx, hat mir sehr weitergeholfen...
Ich habe das Problem so gelöst und es funktioniert wie gewollt *freu*:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
        public string Convert(string sText)
        {
            byte[] textBytes = UnicodeEncoding.UTF8.GetBytes(sText);
            char[] textArray = UnicodeEncoding.UTF8.GetChars(textBytes);
            string newText;

            for (int i = 0; i < textArray.Length; i++)
            {
                if (charDict.ContainsKey(textArray[i]))
                {
                    charDict.TryGetValue(textArray[i], out textArray[i]);
                }
            }

            newText = new string(textArray);

            return newText;
        }


Das ganze macht jetzt aus "leetspeak" -> "13375p34k" und mit dem selben Button aus "13375p34k" wieder "leetspeak".
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 14.03.11 10:57 
Hallo 3marci,

konvertierst du nicht ein bißchen zu viel bei dir (string -> byte array -> char array)?

Ich dachte eher an:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public string Convert(string sText)
{
    StringBuilder sb = new StringBuilder();

    foreach(char c in sText)
    {
        char c2 = c;
        if (charDict.ContainsKey(c))
        {
            c2 = charDict[c];
        }
        // oder alternativ
        // charDict.TryGetValue(c, out c2);

        sb.Append(c2);
    }

    return sb.ToString();
}

Für diesen Beitrag haben gedankt: 3marci