C# – Byte Array als Key in einem Dictionary / HashSet

Heute stand ich vor dem Problem, dass ich ein Byte Array als Index in einem Dictionary in .NET verwenden wollte. Das hat natürlich nicht funktioniert, da der Hash-Code von zwei inhaltsgleichen Byte-Arrays ungleich ist und dadurch der Vergleich beim Zugriff fehl schlägt. Wenn ich also überprüfen möchte, ob ein Key bereits in der Datenstruktur vorhanden ist, wird es immer fehl schlagen, da das erzeugte Objekt mit in den Hashwert eingeht.

Das folgende kleine Beispiel zeigt das Problem:

Man erhält als Ergebnis „Hash Array 1 = ‚37121646‘, Hash Array 2 = ‚45592480‘”. Fügt man also das erste Array z.B. einem Dictionary hinzu, wird mit bei einer Abfrage mit ContainsKey(…) ein false erhalten.

Glücklicherweise gibt es seit .NET 3.5 die Möglichkeit, diesen Datentypen im Konstruktor einen IEqualityComparer<T> mitzugeben, der dann den Vergleich übernimmt.  Eine Klasse, die dieses Interface implementiert, muss die Methoden Equals(…) und GetHashCode(…) zur Verfügung stellen. Für meinen Anwendungsfall reicht die folgende Implementierung:

Wichtig ist hier speziell die GetHashCode(…) Methode. Hier wird der Inhalt des Arrays mit dem BitConverter in einen Hex-String konvertiert und von diesem String der HashCode zurückgegeben. Der Hash wird dann also über den Inhalt gebildet und ist dann bei beiden Arrays gleich. Unsere neue Implementierung wird dem Konstruktor dann mit übergeben und dann in der entsprechenden Datenstruktur verwendet. Das folgende Beispiel zeigt die Anwendung und ein „Vorher / Nachher“ Vergleich:

Startet man das Programm, erhält man folgende Ausgabe „Ohne IEqualityComparer – Contains = False. Mit IEqualityComparer – Contains = True“. Problem gelöst :-).

DES / 3DES Verschlüsselungsbibliothek für Arduino

Für ein kleines Projekt auf dem Arduino Leonardo habe ich vor kurzem eine Crypto-Bibliothek gesucht, mit der ich DES und 3DES Nachrichten verschlüsseln und entschlüsseln kann. Leider bin ich nicht fündig geworden, bzw. zumindest nicht als Bibliothek für die Entwicklungsumgebung des Arduinos. Bei “Das Labor” gibt es aber eine hervorragende Crypto-Bibliothek für Atmel AVR Mikrocontroller – nichts anderes ist ja auch ein Arduino – also habe ich mir den DES / 3DES Teil geschnappt und ihn auf den Arduino portiert. Das Ergebnis habe ich, ganz der GPL folgend, auf GitHub verfügbar gemacht. Solltet ihr also in einem Sketch bei euch auch DES / 3DES Verschlüsselung benötigen, dann könnt ihr die Bibliothek verwenden. Wenn ihr Änderungen habt, dann nichts wie her damit (entweder als Patch oder als Pull-Request per GitHub).

Neuer Spielkram

In den letzten Monaten habe ich mir einiges an komischen Zeug für diverse Projekte bestellt. Zu einem meiner Projekte zählt ein “Super 8 Digitizer”, also eine Vorrichtung, mit der man Super 8 Filme digitalisieren kann. Klar, man könnte einfach den Film an die Leinwand projizieren und dann abfilmen, das Problem ist aber dabei, dass ein Super 8 Film mit 18 fps läuft und eine Digitalkamera die Bilder mit 25 fps aufnimmt. Dadurch, dass die Kamera schneller läuft, bekommt man ein Flimmern im Bild, das zumindest mich stört. Selbst wenn die Kamera gleich schnell wie der Projektor läuft, müsste man beide perfekt miteinander synchronisieren, was so ohne weiteres nicht möglich ist.
Meine Idee ist es deshalb, jeweils Einzelbilder mit einer Digitalkamera / Webcam aufzunehmen und dann später wieder einen Film daraus zu erzeugen. Ein Problem ist bei diesem Projekt der Projektor. Hier muss man sich die Frage stellen, ob man lieber einen alten Projektor umbaut oder sich einen neuen besorgt und durch Zufall bin ich über folgenden Projektor gestolpert:

DSCF1376

Japp, ziemlich viel Plastik, aber dafür nagelneu und läuft mit LED. Er bietet sich jedenfalls sehr für einen Umbau an.
Zur Steuerung habe ich überlegt, wie man am besten und einfachsten eine Ansteuerung hinbekommen kann. Dazu fällt mir natürlich sofort ein Mikrocontroller samt Schrittmotor ein, aber diesmal wollte ich nicht erst einen eigenen kleinen Prototypen selbst bauen, sondern gleich auf etwas fertiges setzen, also fiel die Wahl auf einen Arduino Uno. Den kann man günstig bei Watterott bekommen und man kann ihn auch spielend leicht programmieren.

DSCF1381

Zusätzlich zum Arduino Uno habe ich mir noch gleich ein Ethernet-Shield dazugeholt, da ich anfangs die Bilder auch gleich per Netzwerk auf einem Server ablegen wollte, allerdings habe ich das Modell mittlerweile schon wieder verworfen, da ich die Digitalkamera nicht mehr mit dem Arduino ansteuern werde, denn die Ansteuerung der Kamera wird von einem von mir programmierten, kleinen Programm erfolgen, das eine Logitech C910 Webcam ansteuert. Auch wenn sich Webcam direkt schon nach Qualitätsverlust anhört, trifft das auf diese Webcam nicht zu, denn sie hat eine Auflösung von 10 Megapixel und liefert HD Qualität. Die Ansteuerung ist dadurch auch ziemlich einfach.

Im Prinzip habe ich also schon alles zusammen, was ich für den Digitizer benötige, jetzt fehlt mir nur noch die Zeit dafür ;-).

ProjectEuler.NET – was zum Knobeln für Zwischendurch

Eigentlich wollte ich schon lange mal wieder etwas bloggen, genug Material hatte ich ja schon dafür, aber irgendwie hatte ich bisher noch keine Lust. Trotzdem will ich jetzt ein Projekt vorstellen, mit dem ich momentan viel Spaß habe: Project Euler. Project Euler lässt sich relativ einfach beschreiben: Es werden mathematische Aufgaben gestellt, die mit Hilfe einer frei wählbaren Programmiersprache (oder halt auch nur mit einem Zettel, wenn man das kann) gelöst werden sollen. Momentan werden 300 Probleme auf der Webseite bereitgestellt, die immer gleich abgearbeitet werden. Man bekommt eine Problembeschreibung und ein Beispiel. Anschließend kann man das Problem selbst Lösung und das gefundene Ergebnis auf der Webseite eintragen. Stimmt das Ergebnis wird ein PDF Dokument freigeschaltet, in dem die Lösung nochmal genau beschrieben wird. Hier kann man dann auch durchaus noch Verbesserungen für den eigenen gefundenen Algorithmus finden und seine Lösung entsprechend optimieren.
Die ersten paar Probleme habe ich bereits gelöst und mir ein für mich ausreichendes Framework in C# geschrieben, mit dem ich meine Lösungen recht einfach und komfortabel einbauen kann. Zusätzlich lege ich noch Wert auf Geschwindigkeit, weshalb ich die Geschwindigkeit meiner Lösungen messe und versuche sie zu optimieren.
Solltet ihr auch ein wenig Spaß an ein paar mathematischen Knobeleien haben, dann schaut einfach mal bei Project Euler vorbei. Es lohnt sich.

Keyboardmatrix Konverter

Am Wochenende war es mir eine Spur zu heiss draussen und deshalb habe ich mich an ein schon lange Zeit geplantes Projekt gesetzt und zumindest schonmal den Aufbau auf einer Streifenrasterplatine gemacht. Es handelt sich hierbei um ein USB Gerät, das auf der einen Seite eine Tastaturmatrix als Eingabe hat und sich auf der anderen Seite wie eine USB Tastatur verhält. Insgesamt basiert das Platinenlayout dabei auf einem Referenzdesign von V-USB. Die Software ist allerdings noch nicht fertig und wird von mir mal in Angriff genommen, wenn es mal wieder zeitlich passt. Solange die Software nicht fertig ist möchte ich zum Zweck aber noch nichts sagen. Das fertige Design wird dann irgendwann mal hier im Blog landen.

usb-keyboard-konverter