|
| Autor |
Nachricht |
c0re_ « Moderator »

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.
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

Anmeldedatum: 03.11.2007 Beiträge: 164
|
|
| |
|
 |
ZiG_ Ü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 »

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

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 »

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 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  |
Ich hoffe sie funktioniert wirklich. =)
Diese funktioniert auch nicht. Habe aber die Richtige gefunden. |
|
| |
|
 |
|
|