Autor Beitrag
epsodus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 25.12.14 10:30 
Hallo zusammen, ersteinmal wünsche ich allen ein frohes und besinnliches Weihnachtsfest.
Ich hoffe das mir hier jemand helfen kann. Ich habe vor einiger Zeit mit c# angefangen zu programmieren. Nun möchte ich mir ein Tool erstellen zum decodieren von
Base64, welches ich in winforms angelegt habe.

Folgende Base 64 Zeile funktioniert : MTIzNDU2Nzg5MA==
Dies wird auch decodiert.

Die nun folgende Zeile wird nicht decodiert :
AQEAGwABOTk4OCAgMDACICAgICAgICAyMzMzNwFDUjEzMDU1AQAAAAAAAAAAAAQCMjAxMTAzMTQxODA1WgCBDIAndO/4ZEMOYeNp4aDMTnYQu1aKXiBBuSoL4orKUQ3sOGRxl9J/ZzRhhcybD78mUw8awkrVYbPVn5ms75+6CvcIovqfDYAxxXEZ3iwgue97TGoX1wj5YyaIkstK+hTWnOkikJfzeh0HcAqV75xE2unWw7K2LdeGmXq5GC1hE+2OLACDVgAKlDz6a0HGbYPgNKHdSAzL0oLbB8YpQRBljRLRO3BspOaRaQsYYwv2/5bZeeRyc+ZKc09rhR/ZCej89LdpHAxLsDOG7+OWPY5b96BSnelDWwdpLZ+xXkCVdJwDYTg/1zFRJqEINhzQXpLFjbVDl/O4Hc6s5VbkEG8vTmt06w==

In Hex sollte das rauskommen :
01 01 00 1b 00 01 39 39 38 38 20 20 30 30 02 20 20 20 20 20 20 20 20 32 33 33 33 37 01 43 52 31 33 30 35 35 01 00 00 00 00 00 00 00 00 00 04 02 32 30 31 31 30 33 31 34 31 38 30 35 5a 00 81 0c 80 27 74 ef f8 64 43 0e 61 e3 69 e1 a0 cc 4e 76 10 bb 56 8a 5e 20 41 b9 2a 0b e2 8a ca 51 0d ec 38 64 71 97 d2 7f 67 34 61 85 cc 9b 0f bf 26 53 0f 1a c2 4a d5 61 b3 d5 9f 99 ac ef 9f ba 0a f7 08 a2 fa 9f 0d 80 31 c5 71 19 de 2c 20 b9 ef 7b 4c 6a 17 d7 08 f9 63 26 88 92 cb 4a fa 14 d6 9c e9 22 90 97 f3 7a 1d 07 70 0a 95 ef 9c 44 da e9 d6 c3 b2 b6 2d d7 86 99 7a b9 18 2d 61 13 ed 8e 2c 00 83 56 00 0a 94 3c fa 6b 41 c6 6d 83 e0 34 a1 dd 48 0c cb d2 82 db 07 c6 29 41 10 65 8d 12 d1 3b 70 6c a4 e6 91 69 0b 18 63 0b f6 ff 96 d9 79 e4 72 73 e6 4a 73 4f 6b 85 1f d9 09 e8 fc f4 b7 69 1c 0c 4b b0 33 86 ef e3 96 3d 8e 5b f7 a0 52 9d e9 43 5b 07 69 2d 9f b1 5e 40 95 74 9c 03 61 38 3f d7 31 51 26 a1 08 36 1c d0 5e 92 c5 8d b5 43 97 f3 b8 1d ce ac e5 56 e4 10 6f 2f 4e 6b 74 eb

In DEC wie folgt :
1 1 0 27 0 1 57 57 56 56 32 32 48 48 2 32 32 32 32 32 32 32 32 50 51 51 51 55 1 67 82 49 51 48 53 53 1 0 0 0 0 0 0 0 0 0 4 2 50 48 49 49 48 51 49 52 49 56 48 53 90 0 129 12 128 39 116 239 248 100 67 14 97 227 105 225 160 204 78 118 16 187 86 138 94 32 65 185 42 11 226 138 202 81 13 236 56 100 113 151 210 127 103 52 97 133 204 155 15 191 38 83 15 26 194 74 213 97 179 213 159 153 172 239 159 186 10 247 8 162 250 159 13 128 49 197 113 25 222 44 32 185 239 123 76 106 23 215 8 249 99 38 136 146 203 74 250 20 214 156 233 34 144 151 243 122 29 7 112 10 149 239 156 68 218 233 214 195 178 182 45 215 134 153 122 185 24 45 97 19 237 142 44 0 131 86 0 10 148 60 250 107 65 198 109 131 224 52 161 221 72 12 203 210 130 219 7 198 41 65 16 101 141 18 209 59 112 108 164 230 145 105 11 24 99 11 246 255 150 217 121 228 114 115 230 74 115 79 107 133 31 217 9 232 252 244 183 105 28 12 75 176 51 134 239 227 150 61 142 91 247 160 82 157 233 67 91 7 105 45 159 177 94 64 149 116 156 3 97 56 63 215 49 81 38 161 8 54 28 208 94 146 197 141 181 67 151 243 184 29 206 172 229 86 228 16 111 47 78 107 116 235

Unten versuche ich ASCII auszugeben, es funktioniert auch nicht als DEC oder Hex.

Mein Programmcode sieht wie folgt aus :
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void basetohex_Click(object sender, EventArgs e)
{
    textBox_Output_Hex_Data.Text = Decode(textBox_Input_Data.Text);
}

public string Decode(string str)
{
    return System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(str)); 
}

Was mache ich falsch? Bin für jede Hilfe dankbar

MfG. Volker

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 25.12.14 11:14 
Hallo,

ich nehme an, du verwendest das falsche Encoding. Encoding.ASCII zeigt dir nur 7-Bit Werte an (und alle anderen Zeichen werden als '?' ausgegeben) - verwende mal Encoding.Default oder Encoding.UTF8 (unter Decode from Base64 format kannst du es auch online testen ;- ).

PS: Habe gerade mal deinen Base64-String selber dekodiert - scheint sich wohl um Binärdaten zu handeln, dann solltest du aber nicht einen string, sondern ein byte[] zurückgeben:
ausblenden C#-Quelltext
1:
2:
3:
4:
public byte[] Decode(string str)
{
    return Convert.FromBase64String(str);
}

Und dann dieses Byte-Array in eine Datei (oder ähnliches) abspeichern. Und nur für die Ausgabe am Bildschirm dann als Hex-Code (oder ähnliches) anzeigen.
epsodus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 25.12.14 13:03 
Hallo, Danke für den Tip. Das werde ich gleich mal ausprobieren.
Im Moment bekomme ich hier noch einen Fehler :
ausblenden C#-Quelltext
1:
textBox4.Text = Decode(textBox2.Text);					

Eine implizite Konvertierung vom Typ 'byte[]' in 'string' ist nicht möglich. ( Bezieht sich auf Decode(textBox2.Text )

Muss ich mal noch etwas suchen, dadurch lerne ich auch, denn so fit bin ich noch nicht.

Volker

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 25.12.14 15:00 
Hallo Volker,

wie schon geschrieben, für die Ausgabe mußt du dann z.B. per Encoding.Default.GetString umwandeln. Aber wenn du die Daten weiterverarbeiten möchtest, dann solltest du intern nur mit den Binärdaten (byte[]) arbeiten, und nicht mit Strings.

Was genau soll dein Programm denn machen, d.h. woher kommen die Base64-codierten Strings?

Wenn es ein generelles Base64-Tool sein soll, dann solltest du ähnlich wie die Online-Seite auch verschiedenen Encodings (z.B. per ComboBox) anbieten.
Und evtl. für die Ausgabe dann auch (d.h. als String, Binär, Hex-Code etc.)...
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 25.12.14 16:01 
Also ich habe es mal mit Encoding.Default probiert und da kommt das erwartete Ergebnis raus.
Im Anhang habe ich auch ein kleines Beispielprojekt, dass in alle Richtungen konvertiert (quick and dirty).
Lass dich vom Projektnamen nicht verwirren. Ist in .NET 4.0
Screenshot
Einloggen, um Attachments anzusehen!
_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
epsodus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 25.12.14 17:55 
Hallo C#,

ersteinmal vielen Dank. Ich schaue mir gerade Dein Source mal an, damit bin ich im Moment überfordert. ABER, dies ist eine große Hilfe um es zu verstehen.
Ich werde in kleinen Schritten vorgehen und mein Programm Stück für Stück aufbauen. Im Vordergrund steht der Lerneffekt. Heute Abend versuche ich die HEX-Covertierung hinzubekommen und dann die
DEC, welche über einen Button ausgerechnet werden sollen.

Damit habe ich genug Lernstoff.

Ich Danke hier dem Moderator und C#. Da mein kleines Project noch weiter geht, lasse ich das Thema noch offen.

Mfg. Volker
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 25.12.14 18:15 
Hallo,

kein Problem. Wenn du Hilfe beim Quellcode brauchst bzw. etwas nicht verstehst, frag einfach nach ;)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 25.12.14 19:17 
Allerdings, ich verstehe da eines nicht.

Wie funktioniert diese Aggregate-Funktion ? Da wird mit einem Leerstring und 2 Variablen hantiert und auf wundersame Weise wird das ganze dann hübsch formatiert in die Textbox geschrieben... Ich verstehe die einzelnen Elemente (PadLeft, Trim usw), aber nicht, wie das Konstrukt funktioniert.

MSDN ist absolut nicht hilfreich, das schreibt nur lapidar "Wendet die Akkumulatorfunktion an". Ende der Information, ergo "while (cleverasbefore) {}".

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 25.12.14 20:01 
Auf Stackoverflow ist eine gute Erklärung der Funktion. Da fällt mir auf, dass man bei mir die leeren Strings "" und die Trim()-Funktion streichen kann.

// EDIT:
Nein geht doch nicht :mrgreen:. Sonst passt die Funktionssignatur nicht :gruebel:

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 25.12.14 20:30 
Zitat:
Nein geht doch nicht :mrgreen:. Sonst passt die Funktionssignatur nicht :gruebel:


Wenn du meinst das du denn Seed nicht weglassen kannst dann liegt das daran das du als Seed einen string nimmst und damit klar machst das am Ende der Aggregation ein string rauskommen soll. Ohne Seed wird angenommen das am Ende ein Byte rauskommen soll (ist ja ein byte Array). Es gibt leider keine Aggregate Überladung in dem man den TargetType(TAccumulate) per generischem Parameter explizit festlegen könnte ohne einen Seed anzugeben.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 25.12.14 20:45 
Jop genau das habe ich gemeint. Habe einen Workaround gesucht aber leider keinen gefunden. Man könnte eine eigene Extension Method schreiben die einen default Seed verwendet. Das Problem ist nur, dass dann der erste Akkumulationsdurchlauf (heißt das so :mrgreen:?) den leeren String berücksichtigt und somit ein Leerzeichen vorne dran gestellt wird (oder wie halt die Elemente konkartiniert werden)...

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 25.12.14 21:01 
Zitat:
Das Problem ist nur, dass dann der erste Akkumulationsdurchlauf (heißt das so :mrgreen:?) den leeren String berücksichtigt


Wenn man schon eine Extension Method schreibt sollte man das bisschen Intelligenz die das Problemchen lösst da auch noch unterbringen können ;)
epsodus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 25.12.14 21:34 
Hallo zusammen,

was C# und Ralf Jansen diskutieren, ich verstehe nur Bahnhof. Bitte Bitte, auch für mich etwas Laienhaft erklären. Ich möchte das Thema schon gerne verfolgen.

MfG. Volker
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 25.12.14 21:46 
Diese Diskussion hat relativ wenig mit deiner Frage zu tun. Da ist es nicht schlimm, wenn du als Anfänger nicht alles verstehst.

@Ralf
Wie würde man denn so eine Extension schreiben? Ich meine wenn man die Gleiche Signatur (nur halt ohne Seed) verwenden würde, woher sollte man wissen wie die Strings konkartiniert werden? Man kennt die Angewandte Operation ja letztendlich nicht. Und um den Seed Neutral zu halten, muss man das Neutrale Element der Operation finden. Dafür muss man aber die angewandte Operation kennen und analysieren. Und dabei ist nichteinmal sichergestellt, dass die Operation ein Neutrales Element hat.
Ich hoffe du verstehst mich :mrgreen:

Würde man z.B. eine Multiplikation durchführen, müsste man als Seed eine 1 angeben. Bei Addition wäre es eine 0. Und bei Stringkonkartination wäre es "". Wobei dann das Problem auftritt, dass - falls vorhanden - der String zwischen den Elementen auf einmal vorne stehen würde, also:
ausblenden C#-Quelltext
1:
string.Aggregate("", (a, b) => a + "," + b);					

eine CSV Konvertierung würde hier dann folgendes Ergebnis liefern:
Zitat:
,a,b,c,d,e,f,g...

Genauso wie:
ausblenden C#-Quelltext
1:
string.Aggregate("", (a, b) => a + " - " + b);					

zu
Zitat:
- a - b - c - d - e - f - g...

würde.
Wie sollte man in der Extension Method das erste Komma oder den Bindestrich filtern?

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 25.12.14 23:37 
Der Startwert sollte dann einfach das erste Element sein was damit einher geht das der Quelltyp in den Zieltyp castbar sein muss da dies dann nicht mehr explizit in der func ausprogrammiert werden kann.
Für die meisten Fälle sollte das ausreichend sein bzw. für komplexer Dinge kann man ja auf eine Überladung mit seed zurückfallen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public static TOut MyAggregate<TSource, TOut>(this IList<TSource> source, Func<TOut, TSource, TOut> func)
{
    if (source == null)
        throw new ArgumentNullException("source");
    if (func == null)
        throw new ArgumentNullException("func");
    if (source.Count == 0)
        throw new ArgumentOutOfRangeException("empty source list");

    using (var enumerator = source.GetEnumerator())
    {
        enumerator.MoveNext();                
        TOut result = (TOut)Convert.ChangeType(enumerator.Current, typeof(TOut));
        while (enumerator.MoveNext())
            result = func(result, enumerator.Current);
        return result;
    }
}


Hab die explizit anders benannt weil die anders funktioniert als die anderen Aggregate Überladungen. Z.B. das func nicht n mal für n Elemente aufgerufen wird sondern nur n-1 mal was zu unerwarteten Nebeneffekten führen könnte. Und ich habe auch explizit IList anstatt IEnumerable genommen. Da es in deinem Beispiel in diesem Thread, konkatenieren zu einem string, ja auch auf die Reihenfolge ankommt die ist bei IEnumerable aber nicht definiert. Bei IList eigentlich auch nicht da ist mir aber kein Gegenbeispiel eingefallen in dem das nicht zutrifft.


Edit: Wie vermisse ich doch die alten NNTP Newsgroups :cry: Da konnte man noch jedes Subthema das einen mehr interessierte als die eigentliche Frage einfach in einem Seitenthread weiter verfolgen ohne das sich andere gestört füllen mussten.

Für diesen Beitrag haben gedankt: C#