Avatar billede raos Nybegynder
28. oktober 2003 - 22:30 Der er 20 kommentarer og
1 løsning

gratis base64 dll søges

Jeg skal base64 encode og decode nogle store files (>10 MB). Den algoritme jeg har skrevet i VB er simpelhen ikke hurtig nok. Derfor leder jeg efter en gratis dll som tilbyder denne funktionalitet - og som kan bruges fra VB. Bemærk at det er vigtigt at (en)codingen sker i overensstemmelse med RFC1521
Avatar billede bertelbrander Novice
28. oktober 2003 - 23:17 #1
Måske kan vi oversætte din algoritme til C/C++?

Er den meget stor? Er den hemmelig?
Avatar billede raos Nybegynder
29. oktober 2003 - 06:50 #2
Hverken stor eller hemlig - hvis den skal oversættes skal den producere nøjagtigt det samme resultet. Vi starter med encodingen. Here goes:

------------------------------------------------

'* Encode a string to base64 (rfc1521)
Public Function base64encode(strInString As Variant, ByRef strOutString) As Boolean
    Dim cOut, sOut, i
    Dim inData As String
    inData = CStr(strInString)
   
  'For each group of 3 bytes
  For i = 1 To Len(inData) Step 3
    Dim nGroup, pOut, sGroup
   
    'Create one long from this 3 bytes.
    nGroup = &H10000 * Asc(Mid(inData, i, 1)) + _
      &H100 * MyASC(Mid(inData, i + 1, 1)) + MyASC(Mid(inData, i + 2, 1))
   
    'Oct splits the long to 8 groups with 3 bits
    nGroup = Oct(nGroup)
   
    'Add leading zeros
    nGroup = String(8 - Len(nGroup), "0") & nGroup
   
    'Convert to base64
    pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
   
    'Add the part to output string
   
    sOut = sOut + pOut

   
    'Add a new line for each 76 chars in dest (76*3/4 = 57) - commented out
    'If (i + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
  Next
 
 
  Select Case Len(inData) Mod 3
    Case 1: '8 bit final
      sOut = Left(sOut, Len(sOut) - 2) + "=="
    Case 2: '16 bit final
      sOut = Left(sOut, Len(sOut) - 1) + "="
  End Select
  strOutString = sOut
 
End Function
Avatar billede raos Nybegynder
29. oktober 2003 - 11:03 #3
Jeg har selv fundet nedenstående c++ dll som kan erhverves for blot $29. Den nyes at gøre hvad jeg har brug for  -og er monster hurtig...

http://www.cryptosys.net/encode.html

kommentarer til dette produkt?
Avatar billede bertelbrander Novice
29. oktober 2003 - 23:34 #4
Hvad sker der her:

    pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)

Hvad er Base64 og CLng?

(Basic har ændret sig en del siden jeg sidst arbejdede med det (i starten af 80'erne))
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:22 #5
CLng = konvertering til Long
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:23 #6
Jeg har en lille DLL klar !

Interesseret ?
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:28 #7
B64.h
-----

#ifdef B64_EXPORTS
#define B64_API __declspec(dllexport)
#else
#define B64_API __declspec(dllimport)
#endif

extern "C" {
B64_API void WINAPI B64Encode(const char *oldfilename, const char *newfilename);
B64_API void WINAPI B64Decode(const char *oldfilename, const char *newfilename);
}

B64.cpp
-------

#include "stdafx.h"
#include "B64.h"

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                    )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

struct sixbits { unsigned sb1:6;
                unsigned sb2:6;
                unsigned sb3:6;
                unsigned sb4:6; };

union overlay { struct sixbits sixs;
                char eigths[3]; };

char enc_b64vals[64] = { 'A','B','C','D','E','F','G','H',
                        'I','J','K','L','M','N','O','P',
                        'Q','R','S','T','U','V','W','X',
                        'Y','Z','a','b','c','d','e','f',
                        'g','h','i','j','k','l','m','n',
                        'o','p','q','r','s','t','u','v',
                        'w','x','y','z','0','1','2','3',
                        '4','5','6','7','8','9','+','/' };

int enc_deb64(char c)
{
  switch (c) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        return c-'0'+52;
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
      case 'G':
      case 'H':
      case 'I':
      case 'J':
      case 'K':
      case 'L':
      case 'M':
      case 'N':
      case 'O':
      case 'P':
      case 'Q':
      case 'R':
      case 'S':
      case 'T':
      case 'U':
      case 'V':
      case 'W':
      case 'X':
      case 'Y':
      case 'Z':
        return c-'A';
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
      case 'g':
      case 'h':
      case 'i':
      case 'j':
      case 'k':
      case 'l':
      case 'm':
      case 'n':
      case 'o':
      case 'p':
      case 'q':
      case 'r':
      case 's':
      case 't':
      case 'u':
      case 'v':
      case 'w':
      case 'x':
      case 'y':
      case 'z':
        return c-'a'+26;
      case '+':
        return 62;
      case '/':
        return 63;
      case '=':
        return 0;
      default:
        return -1;
  }
  return -1;
}

void NormalToB64(char *s1,int l1,char *s2,int *l2)
{
  union overlay Cvt;
  char *p = s1;
  int ltmp = (l1*8+5)/6;
  int extra = 3-(ltmp+3)%4;
  int linlen = 0;
  (*l2) = 0;
  // loop through string
  for(int i=0;i<ltmp;i=i+4) {
      // convert 8->6 bit
      Cvt.eigths[2]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[1]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[0]=(((p-s1)<l1)?(*p):0);
      p++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb4];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb3];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb2];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb1];
      (*l2)++;
      // append newline if line too long
      linlen=linlen+4;
      if(linlen>75) {
        s2[*l2]='\n';
        (*l2)++;
        linlen=0;
      }
  }
  // append 0,1 or 2 "="
  (*l2)=(*l2)-extra;
  for(int j=0;j<extra;j++) {
      s2[*l2]='=';
      (*l2)++;
  }
  // append newline
  s2[*l2]='\n';
  (*l2)++;
  return;
}

void B64ToNormal(char *s1,int l1,char *s2,int *l2)
{
  union overlay Cvt;
  char *p = s1;
  int skip = 0;
  (*l2) = 0;
  // loop through string
  while(p<(s1+l1)) {
      // convert 6->8 bit
      Cvt.sixs.sb4=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb3=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb2=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb1=enc_deb64(*p);
      p++;
      s2[*l2]=Cvt.eigths[2];
      (*l2)++;
      s2[*l2]=Cvt.eigths[1];
      (*l2)++;
      s2[*l2]=Cvt.eigths[0];
      (*l2)++;
      (*l2)=(*l2)-skip;
      // skip newline
      if((*p)=='\n') p++;
  }
  return;
}

B64_API void WINAPI B64Encode(const char *oldfilename, const char *newfilename)
{
    struct stat stbuf;
    stat(oldfilename,&stbuf);
    int n = stbuf.st_size;
    FILE *fp1 = fopen(oldfilename, "rb");
    char *buf1 = new char[n];
    fread(buf1,n,1,fp1);
    fclose(fp1);
    char *buf2 = new char[(4*n)/3+4+2*n/75];
    int len;
    NormalToB64(buf1,n,buf2,&len);
    buf2[len] = '\0';
    delete[] buf1;
    FILE *fp2 = fopen(newfilename, "w");
    fprintf(fp2,"%s",buf2);
    fclose(fp2);
    delete[] buf2;
}

B64_API void WINAPI B64Decode(const char *oldfilename, const char *newfilename)
{
    struct stat stbuf;
    stat(oldfilename,&stbuf);
    int n = stbuf.st_size;
    FILE *fp1 = fopen(oldfilename, "r");
    char *buf1 = new char[n];
    char *p = buf1;
    while(!feof(fp1) && fgets(p, n, fp1))
    {
        p += strlen(p);
    }
    fclose(fp1);
    char *buf2 = new char[(3*n)/4];
    int len;
    B64ToNormal(buf1, strlen(buf1), buf2, &len);
    delete[] buf1;
    FILE *fp2 = fopen(newfilename, "wb");
    fwrite(buf2, len, 1, fp2);
    fclose(fp2);
    delete[] buf2;
}
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:29 #8
Og i VB:

Declare Sub B64Encode Lib "D:\IDEProjects\VisualStudio\B64\Release\B64" Alias "_B64Encode@8" (ByVal oldfilename As String, ByVal newfilename As String)
Declare Sub B64Decode Lib "D:\IDEProjects\VisualStudio\B64\Release\B64" Alias "_B64Decode@8" (ByVal oldfilename As String, ByVal newfilename As String)

Function b64test()
    Call B64Encode("C:\z.z", "C:\z.b64")
    Call B64Decode("C:\z.b64", "C:\z.txt")
End Function
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:29 #9
Jeg har testet på en 14 MB fil og det gik rimeligt hurtigt.
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:30 #10
Jeg smider lige DLL'en op så du kan downloade den.
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:33 #11
Avatar billede arne_v Ekspert
30. oktober 2003 - 00:33 #12
Og et svar
Avatar billede raos Nybegynder
30. oktober 2003 - 08:14 #13
jeg er kan desværre ikke få det til at virke fra VB - hvor skal jeg lægge dll'en - og skal den ikke registreres?
Avatar billede arne_v Ekspert
30. oktober 2003 - 08:24 #14
Det burde ikke være nødvendigt.

Du skal bare ligge DLL'en et tilfældigt sted og så rette fil stien i
Declare linierne.
Avatar billede raos Nybegynder
30. oktober 2003 - 08:32 #15
jeg får runtime error 48 "File not found: D:\B64"

Jeg har lagt dll'en i d:\b64.dll

mine declares se sådanne ud:


Declare Sub B64Encode Lib "D:\B64" Alias "_B64Encode@8" (ByVal oldfilename As String, ByVal newfilename As String)
Declare Sub B64Decode Lib "D:\B64" Alias "_B64Decode@8" (ByVal oldfilename As String, ByVal newfilename As String)
Avatar billede arne_v Ekspert
30. oktober 2003 - 08:38 #16
Det burde virke.

Men - hvad Windows version kører du ?
Avatar billede raos Nybegynder
30. oktober 2003 - 09:15 #17
2003
Avatar billede arne_v Ekspert
30. oktober 2003 - 09:22 #18
Hm.

Jeg går i tænke-box.

(grunden til at den ikke skal registreres er at det er en Win32 DLL
ikke en ActiveX DLL)
Avatar billede arne_v Ekspert
30. oktober 2003 - 19:31 #19
Prøv at kopiere DLL'en til system32 directory og load den kun som
"b64" ...

Det er en uskik at smide alle mulige DLL'er der, men vi skal jo prøve at finde
en løsning.
Avatar billede arne_v Ekspert
16. november 2003 - 22:29 #20
Fik du det til at virke ?
Avatar billede raos Nybegynder
18. november 2003 - 19:43 #21
jeg fik en dll der løste mit problem. Men mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester