Base64

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

BtbN

Betreff: Base64

BeitragSo, Okt 29, 2006 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Urbach

ehemals "Basicprogger"

BeitragMo, Okt 30, 2006 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Okt 31, 2006 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 01, 2006 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Im nachhinein frag ich mich das auch... einen moment.

simi

BeitragMi, Nov 01, 2006 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group