Base64
Übersicht

![]() |
BtbNBetreff: Base64 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bisjetzt nur Encode-Funktionen, die Decode-Funktionen folgen in kürze:
Code: [AUSKLAPPEN] SuperStrict
Private Global base64:Int[] = [Asc("A"),Asc("B"),Asc("C"),Asc("D"),Asc("E"),Asc("F"),Asc("G"),Asc("H"),Asc("I"),Asc("J"),Asc("K"),Asc("L"),Asc("M"),Asc("N"),Asc("O"),Asc("P"),Asc("Q"),Asc("R"),Asc("S"),Asc("T"),Asc("U"),Asc("V"),Asc("W"),Asc("X"),Asc("Y"),Asc("Z"),Asc("a"),Asc("b"),Asc("c"),Asc("d"),Asc("e"),Asc("f"),Asc("g"),Asc("h"),Asc("i"),Asc("j"),Asc("k"),Asc("l"),Asc("m"),Asc("n"),Asc("o"),Asc("p"),Asc("q"),Asc("r"),Asc("s"),Asc("t"),Asc("u"),Asc("v"),Asc("w"),Asc("x"),Asc("y"),Asc("z"),Asc("0"),Asc("1"),Asc("2"),Asc("3"),Asc("4"),Asc("5"),Asc("6"),Asc("7"),Asc("8"),Asc("9"),Asc("+"),Asc("/")] Global c_base64:Int[123] Local inc:Int=0,tmp:Int For tmp = 65 To 90 c_base64[tmp] = inc inc :+ 1 Next For tmp = 97 To 122 c_base64[tmp] = inc inc :+ 1 Next For tmp = 48 To 57 c_base64[tmp] = inc inc :+ 1 Next c_base64[43] = inc inc :+ 1 c_base64[47] = inc Public Function StreamToBase64:String(in:TStream) Local byte1:Int,byte2:Int,byte3:Int Local char1:Int,char2:Int,char3:Int,char4:Int Local out:String,cnt:Int,i:Int Repeat byte1 = in.ReadByte() If in.Eof() Then byte2 = Asc("=");cnt :+ 1 Else byte2 = in.ReadByte() If in.Eof() Then byte3 = Asc("=");cnt :+ 1 Else byte3 = in.ReadByte() char1 = base64[byte1 Shr 2] char2 = base64[((byte1 & %11) Shl 4) | (byte2 Shr 4)] char3 = base64[((byte2 & %1111) Shl 2) | (byte3 Shr 6)] char4 = base64[byte3 & %111111] out :+ Chr(char1) + Chr(char2) + Chr(char3) + Chr(char4) Until in.Eof() For i = 1 To cnt out :+ "=" Next Return out EndFunction Function StringToBase64:String(in:String) Local byte1:Int,byte2:Int,byte3:Int Local char1:Int,char2:Int,char3:Int,char4:Int Local out:String,i:Int,cnt:Int If in.length Mod 3 <> 0 Then Repeat in :+ "=" cnt :+ 1 Until in.length Mod 3 = 0 EndIf Repeat byte1 = in[i] byte2 = in[i+1] byte3 = in[i+2] i :+ 3 char1 = base64[byte1 Shr 2] char2 = base64[((byte1 & %11) Shl 4) | (byte2 Shr 4)] char3 = base64[((byte2 & %1111) Shl 2) | (byte3 Shr 6)] char4 = base64[byte3 & %111111] out :+ Chr(char1) + Chr(char2) + Chr(char3) + Chr(char4) Until in.length-i <= 0 For i = 1 To cnt out :+ "=" Next Return out EndFunction Function Base64ToString:String(in:String) Local byte1:Int,byte2:Int,byte3:Int Local char1:Int,char2:Int,char3:Int,char4:Int Local out:String,i:Int,cnt:Int i = in.length in = in.Replace("=","") cnt = i - in.length i = 0 If in.length Mod 4 <> 0 Then Throw "String cannot be a BASE64 encodet string!" Repeat char1 = c_base64[in[i]] char2 = c_base64[in[i+1]] char3 = c_base64[in[i+2]] char4 = c_base64[in[i+3]] i :+ 4 byte1 = (char1 Shl 2) | ((char2 Shr 4) & %11) byte2 = ((char2 & %1111) Shl 4) | ((char3 Shr 2) & %1111) byte3 = ((char3 & %11) Shl 6) | char4 out :+ Chr(byte1) + Chr(byte2) + Chr(byte3) Until in.length-i <= 0 out = out[0..out.length-cnt] Return out EndFunction Function Base64ToStream(in:String,out:TStream) Local byte1:Int,byte2:Int,byte3:Int Local char1:Int,char2:Int,char3:Int,char4:Int Local i:Int,cnt:Int i = in.length in = in.Replace("=","") cnt = i - in.length i = 0 If in.length Mod 4 <> 0 Then Throw "String cannot be a BASE64 encodet string!" Repeat char1 = c_base64[in[i]] char2 = c_base64[in[i+1]] char3 = c_base64[in[i+2]] char4 = c_base64[in[i+3]] i :+ 4 byte1 = (char1 Shl 2) | ((char2 Shr 4) & %11) byte2 = ((char2 & %1111) Shl 4) | ((char3 Shr 2) & %1111) byte3 = ((char3 & %11) Shl 6) | char4 out.WriteByte(byte1) out.WriteByte(byte2) out.WriteByte(byte3) Until in.length-i <= 0 EndFunction Die String-Funktion ist bereits getestet und funktioniert, die Stream-Funktion ist noch ungetestet, sollte aber funktionieren. So, die Decode Funktionen sind nun auch dabei, aber noch nicht getestet. Und die Funktionen wurden durch Arrays ersetzt. |
||
- Zuletzt bearbeitet von BtbN am Mi, Nov 01, 2006 10:44, insgesamt einmal bearbeitet
E. Urbachehemals "Basicprogger" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sehr nützlich, kann ich gerade für ESMTP gebrauchen.
Bei mir funktioniert es. |
||
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik |
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo
Code: [AUSKLAPPEN] Function Convert_Base64:Int(in:Int) Select in Case 0 Return Asc("A") Case 1 Return Asc("B") Case 2 Return Asc("C") Case 3 Return Asc("D") Case 4 Return Asc("E") Case 5 Return Asc("F") Case 6 Return Asc("G") Case 7 Return Asc("H") Case 8 Return Asc("I") Case 9 Return Asc("J") Case 10 Return Asc("K") Case 11 Return Asc("L") Case 12 Return Asc("M") Case 13 Return Asc("N") Case 14 Return Asc("O") Case 15 Return Asc("P") Case 16 Return Asc("Q") Case 17 Return Asc("R") Case 18 Return Asc("S") Case 19 Return Asc("T") Case 20 Return Asc("U") Case 21 Return Asc("V") Case 22 Return Asc("W") Case 23 Return Asc("X") Case 24 Return Asc("Y") Case 25 Return Asc("Z") Case 26 Return Asc("a") Case 27 Return Asc("b") Case 28 Return Asc("c") Case 29 Return Asc("d") Case 30 Return Asc("e") Case 31 Return Asc("f") Case 32 Return Asc("g") Case 33 Return Asc("h") Case 34 Return Asc("i") Case 35 Return Asc("j") Case 36 Return Asc("k") Case 37 Return Asc("l") Case 38 Return Asc("m") Case 39 Return Asc("n") Case 40 Return Asc("o") Case 41 Return Asc("p") Case 42 Return Asc("q") Case 43 Return Asc("r") Case 44 Return Asc("s") Case 45 Return Asc("t") Case 46 Return Asc("u") Case 47 Return Asc("v") Case 48 Return Asc("w") Case 49 Return Asc("x") Case 50 Return Asc("y") Case 51 Return Asc("z") Case 52 Return Asc("0") Case 53 Return Asc("1") Case 54 Return Asc("2") Case 55 Return Asc("3") Case 56 Return Asc("4") Case 57 Return Asc("5") Case 58 Return Asc("6") Case 59 Return Asc("7") Case 60 Return Asc("8") Case 61 Return Asc("9") Case 62 Return Asc("+") Case 63 Return Asc("/") Default Throw "Illeagal Number: "+Bin(in) EndSelect EndFunction Hast Du schon was von Arrays gehört? MfG Florian |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Im nachhinein frag ich mich das auch... einen moment. | ||
![]() |
simi |
![]() Antworten mit Zitat ![]() |
---|---|---|
mh, wenns schon ein array sein sollte, dann nimmst du besser gleich einen String.....
Sonst kann man das ganz einfach auch so machen: Code: [AUSKLAPPEN] Function Convert_Base64:Int(in:Int)
Return in+65+(in>25)*6-(in>51)*75-(in=62)*15-(in=63)*12 End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group