Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Fragen - Antworten
Autor
Nachricht
c0re_
« Moderator »<b><font color=green>« Moderator »</font



Anmeldedatum: 29.11.2007
Beiträge: 425

[S] Übersetzung einer Delphi Funktion
Verfasst am: 16.02.2008, 21:19

Ich habe nach einer bestimmten Base64 Funktion gesucht, diese aber nur in Delphi gefunden.
Da Delphi aber nicht unbedingt mein Spezialgebiet ist, bitte ich euch die Funktion für mich zu übersetzen. Very Happy

Delphi:

Code:
function DecodeBase64(Value: String): String;
const b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  function DecodeChunk(const Chunk: String): String;
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0; Result := '';
    for i := 1 to 4 do
      if Pos(Chunk[i], b64alphabet) <> 0 then
        W := W + Word((Pos(Chunk[i], b64alphabet) - 1)) shl ((4 - i) * 6);
    for i := 1 to 3 do
      Result := Result + Chr(W shr ((3 - i) * 8) and $ff);
  end;
begin
  Result := '';
  if Length(Value) mod 4 <> 0 then Exit;
  while Length(Value) > 0 do
  begin
    Result := Result + DecodeChunk(Copy(Value, 0, 4));
    Delete(Value, 1, 4);
  end;
end;

Ich hatte auch schon mal angefangen zu übersetzen. So weit bin ich gekommen:

Code:
Public Function MyBase64(ByVal OriginalString As String) As String
Const b64alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

Dim W As String ' LongWord
Dim i As Byte
MyBase64 = ""

If Len(Value) Mod 4 <> 0 Then Exit Function ' ###
Do While Len(Value) > 0 ' ###
MyBase64 = Result + DecodeChunk(Copy(Value, 0, 4)) ' ###
Delete(Value, 1, 4) ' ###
Loop
End If
End Function

Private Function DecodeChunk(ByVal Chunk As String) As String
W = 0
DecodeChunk = ""

For i = 1 To 4
If Pos(Chunk(i), b64alphabet) <> 0 Then ' ###
W = W + Word((Pos(Chunk(i), b64alphabet) - 1)) shl ((4 - i) * 6) ' ###
End If
Next

For i = 1 To 3
decodechunk = Result + Chr(W shr ((3 - i) * 8) and $ff) ' ###
Next
End Function

Ich glaube, es müssen nur noch die Zeilen die mit ### (Kommentar) gekennzeichnet sind übersetzt werden.
Bin mir aber nicht ganz sicher.

Danke schon mal im Vorraus!

mfg Orbz
 
Rausch_
Poster
Poster

Anmeldedatum: 03.11.2007
Beiträge: 164


Verfasst am: 17.02.2008, 12:33

http://vb-tec.de/base64.htm
1 sec google
 
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248


Verfasst am: 17.02.2008, 12:45

Er sucht nicht nach irgendeiner base64 Funktion sondern einer bestimmten.
Klar gibt es für VB6 auch base64, nur eben nicht die verschiedenen Varianten.

Aber evt. findest du was aus www.pscode.com

Edit//
Auszug aus der Seite von vb-tec.
Code:

Achtung: Diese Routine führt bei Unicode-(Sonder-)Zeichen zu Fehlern! (Apropos: Warum ist eigentlich Asc(Chr$(128)) nicht gleich AscW(Chr$(128))?) Diese Routine darf also nur dann eingesetzt werden, wenn 100%-ig klar ist, dass der Inhalt aus "normalen" Zeichen besteht (etwa Quelltexte)!


Deswegen sucht er auch nach einer anderen.
Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
 
c0re_
« Moderator »<b><font color=green>« Moderator »</font



Anmeldedatum: 29.11.2007
Beiträge: 425


Verfasst am: 17.02.2008, 12:55

Bingo! Allerdings stimmen die beiden Base64 String noch. Erst wenn ich ihn in Hexadezimalstellen umwandele nicht mehr.
 
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248


Verfasst am: 17.02.2008, 13:00

Und warum suchst du dann ne andere base64 Funktion?^^
Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
 
c0re_
« Moderator »<b><font color=green>« Moderator »</font



Anmeldedatum: 29.11.2007
Beiträge: 425


Verfasst am: 17.02.2008, 13:08


Ich weiß nicht. Vielleicht sehen die Strings nur gleich aus, haben aber unterschiedliche Ascii (und deshalb auch Hex) Werte. Kann mir schwer vorstellen, dass es an der StringToHex Funktion liegt.

Edit//
Zitat vom Bored Coders Board.

rockZ hat Folgendes geschrieben:
Und wieso genau die? Oder geht es nur um die "Übersetzung-Skills"?

//edit
Hab mich mal rangesetzt, und soweit bin ich gekommen:
Code:
Option Explicit

Private Const Base64 As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

Public Function DecodeBase64(ByVal Encoded As String) As String
    Dim i       As Long
   
    If Len(Encoded) Mod 4 <> 0 Then Exit Function
   
    For i = 1 To Len(Encoded) Step 4
        DecodeBase64 = DecodeBase64 & DecodeChunk(Mid(Encoded, i, 4))
    Next i
End Function

Private Function DecodeChunk(Chunk As String) As String
    Dim W       As Long
    Dim i       As Byte
   
    For i = 1 To 4
        If InStr(1, Base64, Mid(Chunk, i, 1)) <> 0 Then
            W = W + shl(CLng(InStr(1, Base64, Mid(Chunk, i, 1)) - 1), ((4 - i) * 6))
        End If
    Next i
   
    For i = 1 To 3
        DecodeChunk = DecodeChunk & Chr(shr(W, ((3 - i) * 8)) And &HFF)
    Next i
End Function

Private Function shl(ByVal Old As Long, ByVal shift As Long) As Long
    ' SHL = SHift Left
    ' Verschiebt die einzelnen bits *shift* nach links
    ' 00110011 -->
    ' 01100110
   
    If shift = 0 Then shl = Old: Exit Function
    shl = Old * (2 ^ shift)
End Function

Private Function shr(ByVal Old As Long, ByVal shift As Long) As Long
    ' SHR = SHift Right
    ' Verschiebt die einzelnen bits *shift* nach rechts
    ' 00110011 -->
    ' 00011001
   
    ' 0 macht nix.
    If shift = 0 Then shr = Old: Exit Function
    shr = Old / (2 ^ shift)
End Function


Rein codetechnisch ist es korrekt, nur leider funktioniert es nur nicht Very Happy Fragt sich jetzt ob ich falsch übersetzt habe oder ob die Delphi Funktion auch nicht ging...

//edit: Habs! Meine SHL/SHR Funktionen waren falsch. Jetzt gehts Wink

Ich hoffe sie funktioniert wirklich. =)
Diese funktioniert auch nicht. Habe aber die Richtige gefunden.
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Fragen - Antworten

Tags: delphi, shr, übersetzen, funktion

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 916 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 1023 30.09.2007, 09:57
Keine neuen Beiträge TopMost Funktion unter DirectX 1022 27.07.2007, 11:48
Keine neuen Beiträge Wie Funktion nutzen ? 1214 29.06.2007, 21:59
Keine neuen Beiträge update funktion einbauen 1455 29.01.2007, 00:11
 


[ Time: 0.0859s ][ Queries: 95 (0.0401s) ][ GZIP on - Debug on ]