000
10.03.2006, 15:01 Uhr
FaVorith
|
Hallo! Ich habe mir aus dem Internet einen C-Code heruntergeladen, welcher den Hash einer Datei mit dem Adler-32-Algorithmus berechnet. In der Windows-Eingabeaufforderung klappt das auch alles wunderbar (der Code wurde mit Visual C++ in eine Exe kompiliert), allerdings möchte ich aus dem Code nun eine Dll erzeugen, welche ich aus meinem Visual Basic-Programm heraus aufrufen kann.
Daher muss ich den Code etwas verändern: Es soll nur noch ein Argument übergeben werden können (Pfad und Dateiname), außerdem sollen die Fehlermeldungen entfernt werden (es soll höchstens eine Fehlernummer zurückgegeben werden, welche ich in meinem Visual Basic-Programm auswerte) und es wäre auch toll, wenn man noch etwas machen könnte, um den Code nochmals zu beschleunigen. Und die wichtigste Anforderung: Der Code muss als 32Bit-Dll kompiliert werden können und die __stdcall-Konvention erfüllen.
Leider kann ich die Aufgaben selbst nicht lösen, da ich nicht in C programmieren kann.
Ich bin daher vollständig auf euch angewiesen und wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Hier der Code:
C++: |
#include <stdio.h> #include <stdlib.h>
unsigned long update_adler32(unsigned long old, unsigned char *buf, int len) { #define BASE 65521 /* largest prime smaller than 65536 */ unsigned long s1 = old & 0xffff; unsigned long s2 = (old >> 16) & 0xffff; int n; for (n = 0; n < len; n++) { s1 = (s1 + buf[n]) % BASE; s2 = (s2 + s1) % BASE; } return( (s2 << 16) + s1 ); } /* update_adler32() */
int main(int argc, char *argv[]) { int RetCode, BufferSize, Number; FILE *CheckFile; unsigned char *Memory; unsigned long Adler32, TotalNumber;
printf("\n checksum - calculates the Adler32 checksum of a given file\n"); RetCode = 10; if (argc > 3) printf("\n error: too many arguments!\n"); else { if (argc == 3) BufferSize = atoi(argv[2]) * 1024; else BufferSize = 16*1024; /* voreingestellte Größe des Lesepuffers */
if (argc > 1) { CheckFile = fopen(argv[1], "rb"); if (CheckFile == NULL) { printf("\n error: could not open file for reading!\n"); } else { Memory = malloc(BufferSize); if (Memory == NULL) printf("\n error: could not allocate enough memory!\n"); else { printf("\n calculating checksum ..."); Adler32 = 1L; TotalNumber = 0L; do { Number = fread(Memory, 1, BufferSize, CheckFile); if (Number > 0) { Adler32 = update_adler32(Adler32, Memory, Number); TotalNumber += Number; } } while (Number > 0); printf("\r could read %lu bytes from file", TotalNumber); printf("\n adler checksum is $%08lx\n", Adler32); RetCode = 0; free(Memory); } fclose(CheckFile); } } else printf("\n usage: checksum <filename> [buffersize in kbytes]\n"); } return(RetCode); } /* Checksum.c Copyright (c) Christian Siebert */
|
|