Base64 und Unicode probleme

Für allgemeine Fragen zur Programmierung mit PureBasic.
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Base64 und Unicode probleme

Beitrag von Christian+ »

Der Base64Encoder gibt die Größe in Bytes zurück Left erwartet aber die Zeichen Anzahl das zu mischen ist bei Unicode mit mehr als einem Byte pro Zeichen nicht so gut. Zweitens der Base64Encoder Output ist Ascii es ist möglich ihn mit PeekS und Ascii zu konvertieren das ist vor dem Decodieren dann aber noch mal nötig mit PokeS Ascii da sonst der Encoder nicht die korrekte Bytefolge bekommt. Ich würde einfach zwei Proceduren erstellen die Encoder/Decoder mit Umwandeln zusammen ausführen z.B. so:

Code: Alles auswählen

Procedure.s MyBase64Encoder(*DataBuffer, Bytes)
  Protected *Memory = AllocateMemory(Bytes * 1.5 + 64), Size.i
  Size = Base64Encoder(*DataBuffer, Bytes, *Memory, 50000)
  ProcedureReturn PeekS(*Memory, Size, #PB_Ascii)
EndProcedure

Procedure MyBase64Decoder(StringEncoded$, *Output, OutputSize.i)
  Protected EncodedSize.i = StringByteLength(StringEncoded$, #PB_Ascii)
  Protected *Memory = AllocateMemory(EncodedSize + 1), Size
  PokeS(*Memory, StringEncoded$, EncodedSize, #PB_Ascii)
  ProcedureReturn Base64Decoder(*Memory, EncodedSize, *Output, OutputSize)
EndProcedure

Define Crc.q

*FileDataBuffer  = AllocateMemory(512)

FileName$ = "D:\Projects\Purebasic\network\103385-1920x1080.jpg"

Fileh = ReadFile(#PB_Any, FileName$)

If Fileh
  FileLen = Lof(Fileh)
  
  For I=0 To FileLen Step 512
    FileSeek(Fileh, I)
    
    Bytes = ReadData(Fileh, *FileDataBuffer, 512)
    Debug CRC32Fingerprint(*FileDataBuffer, Bytes)
    
    ;StringEncoded$ = Space(50000)
    ;enc = Base64Encoder(*FileDataBuffer, Bytes, @StringEncoded$, 50000)
    ;StringEncoded$ = Left(StringEncoded$, enc)
    ;StringEncoded$ = PeekS(@StringEncoded$, enc, #PB_Ascii) ; Konvertieren
    StringEncoded$ = MyBase64Encoder(*FileDataBuffer, Bytes)
    
    Debug StringEncoded$
    
    *Decode = AllocateMemory(50000)
    ;Bytes = Base64Decoder(@StringEncoded$, enc, *Decode, 50000)
    Bytes = MyBase64Decoder(StringEncoded$, *Decode, 50000)
    
    Debug CRC32Fingerprint(*Decode, Bytes)
    
    CallDebugger
    
  Next
  CloseFile(Fileh)
EndIf
Hier auch mal noch das einfache Beispiel Unicode tauglich:

Code: Alles auswählen

StringEncoded$ = "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAQ4B4ADASIAAhEBAxEB/8QAHQAAAgMBAQEBAQAAAAAAAAAAAwQBAgUABgcICf/EAFcQAAEEAQMCBQIEAwYEBAACGwEAAgMRBBIhMQVBBhMiUWFxgQcUMpFCobEIFSNSwdEWM2JyJIKS4Rc0Q1Oi8PElNWODsglEc4STsyZFo8InNkZUVVZk/8QAHAEAAgMBAQEBAAAAAAAAAAAAAAIBAwQFBgcI/8QAPxEAAgIBBAICAQIEBAUDAgUFAAECEQMEEiExBUETUSIUYQYycYEVI0KRUqGxwdEz4fAkYhY1Q3LxJTREU4L/2gAMAwEAAhEDEQA/APsQNqzRVlQG3wFYA9wnGJbq5KOzuqNaDyjNj43Ssj2Xa2gN0Zh3v2QwCO9orANKgYMxoPIVwDxSiHkXwmWgVuEADbG4bozWgcKQCeAraa3SsCwdvwrijyFRtbEohA5CgZE6R7/ZXbXbshg="

*Encode = AllocateMemory(StringByteLength(StringEncoded$, #PB_Ascii) + 1)
PokeS(*Encode, StringEncoded$, StringByteLength(StringEncoded$, #PB_Ascii), #PB_Ascii)

CRC.q = CRC32Fingerprint(*Encode, StringByteLength(StringEncoded$, #PB_Ascii))
Debug CRC ; 2364089344

*Decode = AllocateMemory(50000)

Bytes = Base64Decoder(*Encode, StringByteLength(StringEncoded$, #PB_Ascii), *Decode, 50000)

CRC.q = CRC32Fingerprint(*Decode, Bytes)
Debug CRC ; 3341594285
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660