Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C-Code beschleunigen und als Dll kompilieren

Empfohlene Antworten

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:


#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 */ 

Ich habe mir aus dem Internet einen C-Code heruntergeladen, welcher den Hash einer Datei mit dem Adler-32-Algorithmus berechnet.

Hast Du die nötigen Nutungsrechte?

Daher muss ich den Code etwas verändern:

Hast Du die nötigen Rechte, den Code verändern zu dürfen?

Leider kann ich die Aufgaben selbst nicht lösen, da ich nicht in C programmieren kann.

Wenn Du die beiden ersten Fragen nicht mit ja beantworten kannst, erübrigt sich der Rest.

Zu den Fragen:

- __stdcall vor den Funktionsnamen setzen, um die Aufrufkonvention anzupassen.

- Die erste Funktion berechnet die Prüfsumme über einen Speicherbereich. Du musst also die Datei in den Speicher laden, so wie es die main Funktion tut.

- Du kannst die main Funktion in eine neue Funktion umschreiben, der Du als Parameter den Dateinamen übergibst. Wenn Du dazu Fragen hast, dann stell sie ruhig. Ich denke nicht, dass Du jemanden finden wirst, der Dir die Arbeit abnimmt (siehe auch andere Postings (nicht von Dir) in letzter Zeit).

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.