Antwort erstellen 
:
Complete the task
Benutzername:
Betreff:
Nachrichtentext:
Gib deine Nachricht hier ein. Sie darf nicht mehr als 60000 Zeichen enthalten. 

Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbdown: :thumbup: :wave: :wtf: :yawn:
Schriftgröße:
Tipp: Formatierungen können schnell auf den markierten Text angewandt werden.  Schriftfarbe
Optionen:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist eingeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
BBCode ausschalten
Smilies ausschalten
URLs nicht automatisch verlinken
   

Die letzten Beiträge des Themas - Download und Kurzanleitung 
Autor Nachricht

Mit Zitat antworten Beitrag Verfasst: Do 21. Aug 2014, 14:14
Update: Tools
Hallo Leute!

Es gibt immer wieder Methoden, die man für so ziemlich jedes Projekt gebrauchen kann. Deshalb füge ich diese meiner Storage gerne in der Projektdatei "Tools.cs" hinzu. Folgende Tools gibt es bisher:

Code:
 
 // Ermöglicht die Verwendung von Keylines (Die Bytes des Schlüssels und IV als string gespeichert)
 /// <summary>
 /// BlockSize = 256, KeySize = 256, Padding = PaddingMode.Zeros, Mode = CipherMode.CBC
 /// Compatible to Rijndael used in PHP
 /// </summary>
 public static RijndaelManaged GetNewRijndael()
 public static string GetNewKeyline()
 public static Rijndael KeylineToRijndael(string keyline)
 public static string RijndaelToKeyline(Rijndael rijndael)
 
 // Schreibt die übergeben Bytes in die angegebene Datei. Bei Bedarf komprimiert (mit GZip)
 // oder verschlüsselt mit Rijndael (ggf. mit Keyline)
 public static void WriteFile(string fullpath, byte[] bytes, bool compressed)
 public static void WriteFile(string fullpath, byte[] bytes, string keyline)
 public static void WriteFile(string fullpath, byte[] bytes, Rijndael rijndael)
 
 // Liest die angegebene Datei und gibt die ggf. enschlüsselten Bytes zurück
 public static byte[] ReadFile(string fullpath, bool compressed)
 public static byte[] ReadFile(string fullpath, string keyline)
 public static byte[] ReadFile(string fullpath, Rijndael rijndael)
 
 // Gibt den md5-Hash eines strings oder byte-Arrays zurück. Ggf. wie in PHP
 public static string MD5(string textToHash, bool php)
 public static string MD5(byte[] bytes, bool php)
 
 // Gibt den SHA256-Hash eines strings oder byte-Arrays zurück. Ggf. wie in PHP
 public static string SHA256(string input, bool php)
 public static string SHA256(byte[] input, bool php)
 
 // Verschlüsselt und entschlüsselt ein byte-Array
 public static byte[] Encrypt(byte[] bytes, Rijndael rijndeal)
 public static byte[] Decrypt(byte[] bytes, Rijndael rijndeal)
 
 // Gibt eine RijndaelManaged-Instanz zurück dessen Key und IV mithilfe einer
 // Rfc2898DeriveBytes-Instanz generiert wird.
 public static RijndaelManaged PasswordToRijndael(string password, int saltLength = 256, int interations = 256)
 
 // Generiert ein Salt aus dem gegebenen Input (Passwort wird gehashed)
 public static byte[] Salt(string password, int length, int interations, string salt = "s@1t by Magony.ORG :)")
 
 // Füllt das angegebene byte-Array mit zufälligen Bytes. Somit kann das alte
 // byte-Array nicht mehr im Speicher ausgelesen werden
 public static void Destroy(ref byte[] bytes)
 
 // Vergleicht die beiden übergebenen Arrays und speichert in "Value", ob sie identisch sind.
 public struct IdenticalArrays<T>
        {
            public readonly bool Value;
            public IdenticalArrays(T[] a, T[] b)
        }
 
 // Die Klasse TreeNodeMaker kann die TreeNodes für ein TreeView (Objekt in einer Windows-Form)
 // erstellen. Als Input können die einzelnen z.B. Dateispfade dienen. Außerdem können den Einträgen
 // Bilder durch ein Pattern hinzugefügt werden. Nicht vergessen "MakeTreeNodes()" aufzurufen :)
 public class TreeNodeMaker
        {
            public TreeView TreeView;
            public Dictionary<string, TreeNode> TreeNodes;
            public Dictionary<string, int> ImageListIndex;
 
            public enum ImageZuordnung { Keine, Exakt, Pattern, StartWith, EndsWith }
            public ImageZuordnung ImageZuordnungmodus { get; set; }
 
            public char SplitChar { get; set; }
            public string Stamm { get; set; }
            public List<string> Nodes;
 
            public TreeNodeMaker(TreeView treeView, string stamm, params string[] nodes)
 
            public void MakeTreeNodes()
            public void MakeTreeNodes(string[] nodes)
            public void MakeTreeNodes(string stamm, string[] nodes)
        }
 
 // Zum Schlüss noch eine statische Klasse, die alle Möglichkeiten des string.Format leichter zugänglich macht
 // Hier vier der 17 Methoden:
            /// <summary>
            /// A currency value.
            /// </summary>
            /// <param name="value">All numeric types.</param>
            public static string Currency(object value) { return string.Format("C", value); }
            /// <summary>
            /// A currency value.
            /// </summary>
            /// <param name="value">All numeric types.</param>
            /// <param name="precision">Number of decimal digits.</param>
            public static string Currency(object value, byte precision)
 
            /// <summary>
            /// Integral and decimal digits, group separators, and a decimal separator with optional negative sign.
            /// </summary>
            /// <param name="value">All numeric types.</param>
            public static string Number(object value) { return string.Format("N", value); }
            /// <summary>
            /// Integral and decimal digits, group separators, and a decimal separator with optional negative sign.
            /// </summary>
            /// <param name="value">All numeric types.</param>
            /// <param name="precision">Desired number of decimal places.</param>
            public static string Number(object value, byte precision)
 
 

Zu den "Standard Numeric Format Strings" (string.Format) gibt es hier mehr: http://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx

Zu der TreeNodeMaker-Klasse ist noch ein Tutorial geplant.

Schöne Grüße,
Magony

Mit Zitat antworten Beitrag Verfasst: Fr 20. Dez 2013, 00:01
Packs Fixed
Hallo Leute!

Heute brauchte ich die Packs um die Pfadmap für eine Karte zu speichern und da ist mir aufgefallen, dass die Packs falsch gespeichert wurden. Dies habe ich durch Entfernen von zwei Zeilen - die mir noch immer ein Rätsel aufgeben woher die kamen - lösen.

Schöne Grüße,
Magony

Mit Zitat antworten Beitrag Verfasst: Sa 18. Mai 2013, 21:13
Update: Packs
Hallo Leute!

Da das Speichern von SubStorages, jedes in eine eigene Datei, bei vielen Einträgen unschön ist, gibt es nun die Packs. Alle Storages, die in dieser Liste aufgeführt sind, werden in dieselbe Datei gespeichert, wie die Storage, zu der sie gehören. Dabei wird der Speicherbedarf auf Name und Einträge minimiert. Es werden also keine Pfadangaben oder Keyline gespeichert.

Ich habe meine Storage einen kleinen Leistungstest unterzogen. Dabei habe ich alle Einträge des BLZ-Verzeichnisses der Bundesbank einer Storage hinzugefügt. Zu jeder BLZ gehörten mehrere Einträge von Zahlungsdienstleistern. Jeder Eintrag ist eine Instanz der BLZ-Klasse. Gespeichert habe ich das nach folgende zwei Methoden:

Datenbank-Methode
Die BLZ-Instanzen wurden jeweils in einen String gespeichert. Alle Einträge mit der selben BLZ wurden zu einem String-Array zusammengefasst und als Eintrag, mit der BLZ als Key, in die Variable Database gespeichert.

Pack-Methode
Die BLZ-Instanzen wurden jeweils als Storage gespeichert. Alle Einträge mit der selben BLZ wurden einer Storage als Pack hinzugefügt, die wiederherum als Pack in der Storage gespeichert war, die alle Einträge speicherte.

Zehn mal Laden mit der Datenbank-Methode hat etwa 6 Sekunden gedauert, zehn mal Laden mit der Pack-Methode hat etwa 37 Sekunden gedauert. Die Pack-Methode ist etwas aufwendiger, weil mehrere Storage-Instanzen analysiert werden müssen. Außerdem werden beim Abspeichern die Namen der Felder immer wieder abgespeichert, wobei bei der Datenbank-Methode die Einträge einfach durch ein Split-Zeichen getrennt wurden. Somit wurde auch doppelt soviel Speicherplatz benötigt.

Die Pack-Methode hinkt noch ein wenig der Datenbank-Methode hinterher. Gerade bei sehr vielen Einträgen (das BLZ-Verzeichnis hatte über 19.000) wirkt sich das negativ auf die Performance aus. Allerdings ist sie deutlich besser als die SubStorage-Methode (Abspeichern als SubStorage anstatt als Pack) die noch mehr Speicher verbrauchen würde und noch mehr Daten auszuwerten hätte. Dafür muss man bei der Datenbank-Methode mit dem Minimalsten auskommen. Bei der Datenmenge ist das hier äußert sinnvoll. Beim Abspeichern von komplexen Klassen sollte man dann doch lieber auf die Pack-Methode zurückgreifen.

Schöne Grüße,
Magony

Mit Zitat antworten Beitrag Verfasst: Di 7. Mai 2013, 15:14
Download und Kurzanleitung
Hallo Leute!

Ab sofort könnt ihr hier die neue magonyORG.Storage-Klasse herunterladen:
http://download.magony.org/?file=csharp/magonyORG_Storage/magonyORG.Storage.zip

Zur Benutzung:
Im Konstruktor gibt ihr den Namen der Storage und den vollständigen Pfad, unter dem die Datei gespeichert werden soll, an. Auf eine Extension könnt ihr dabei verzichten, weil die Datei immer auf ".sge" enden wird. Optional kann man Parameter angeben, ob die Datei komprimiert oder verschlüsselt gespeichert werden soll. Dieser Storagemode wird im Property Mode gespeichert.

Eine Keyline ist ein String, indem der Key und IV einer Rijndael-Klasse gespeichert ist. Er wird zum Verschlüsseln und Entschlüsseln der Datei benötigt. Die Klasse bietet statische Methoden für die Generierung einer neuen Keyline. Jede Storage wird im Konstruktor - auch wenn sie nicht verschlüsselt gespeichert werden soll - eine Keyline hinzugefügt.

Alle Einträge werden im Wörterbuch Database gespeichert. Bearbeitet diese Einträge am besten nicht manuell - außer ihr wollt einen Eintrag löschen. Verwendet die Methoden Set zum Manipulieren, Add zum Hinzufügen und Get zum Abrufen der Einträge.

Die SubStorages sind in der Liste SubStorages gespeichert. Diese sind zunächst nicht geladen, das heißt, dass ihre Variablen Database und SubStorages noch leer sind. Um sie zu laden verwendet die Methode Load der Instanz (also nicht die statische Methode). Sie gibt direkt den Instanzenverweis der Storage zurück. Ob eine Storage bereits geladen ist, ist im Property IsLoaded gespeichert. Beim Speichern der Storage werden auch alle SubStorages gespeichert. Allerdings unter einem "SubStorage-Pfad" - wenn man das so nennen möchte. Dieser Pfad wird dann von der Storage selbst bestimmt und überschreibt die zuvor eingestellten Pfade der SubStorages. Man kann jede Storage einer anderen hinzufügen, indem man sie deren Liste SubStorages hinzufügt.

Mit der Methode Save wird die Storage und alle SubStorages gespeichert. Ggf. an den Speicherort den man als Parameter angegeben hat. Bleibt er ein leerer String, wird der Pfad aus dem Property Fullpath verwendet. Ansonsten wird dieser überschrieben.

Die XML-Dokumentation wird noch nachgeliefert.

Schöne Grüße,
Magony


Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum