Parser Base64 para VFP usando CryptoAPI

From codeWiki
Jump to: navigation, search

Por: VictorEspina

Contents

Introduccion

Una de las formas mas fáciles de almacenar información binaria en una base de datos es hacerlo en formato Base64, el cual toma contenido binario y lo convierte en un string de texto "seguro" que puede ser almacenado como si fuese un texto cualquiera.


A pesar de que VFP incluye la posibilidad de convertir hacia y desde Base64 a través de la función STRCONV, la siguiente rutina utiliza directamente el API de Windows para realizar la labor de convertir un string en Base64 y viceversa, lo cual en teoria debería ofrecer mejores tiempos de respuesta en archivos grandes.


8 Sep 2016 Se incluyo una pequeña modificacion en decodeString para ajustar el string base64 cuando el mismo se ha recuperado desde SQL Server.


Ejemplos de uso

La librería ofrece métodos para convertir tanto cadenas como archivos directamente. Por ejemplo, para convertir cadenas a Base64:

cBase64 = base64Helper.encodeString("ESTO ES UNA PRUEBA")
?cBase64 --> "RVNUTyBFUyBVTkEgUFJVRUJB"


Para restaurar la cadena original en base a su representación Base64:

cCadena = base64Helper.decodeString("RVNUTyBFUyBVTkEgUFJVRUJB")
?cCadena --> "ESTO ES UNA PRUEBA"


Para generar una representación Base64 de un archivo cualquiera:

cBase64 = base64Helper.encodeFile("c:\documentos\propuesta.doc")


Y para recuperar el archivo original en base a su representación base64:

base64Helper.decodeFile(cBase64, "c:\temp\propuesta.doc")


Codigo Fuente

* base64Helper
* Clase helper para codificar y decodificar en formato Base64
*
* Autor: Victor Espina
*
* Adaptado a partir del codigo publicado por Anatoliy Mogylevets
* en FoxWikis: http://fox.wikis.com/wc.dll?Wiki~VfpBase64
* 
DEFINE CLASS base64Helper AS Custom
 *
 
 *-- COnstructor
 PROCEDURE Init
  *
  DECLARE INTEGER CryptBinaryToString IN Crypt32;
	STRING @pbBinary, LONG cbBinary, LONG dwFlags,;
	STRING @pszString, LONG @pcchString

  DECLARE INTEGER CryptStringToBinary IN crypt32;
	STRING @pszString, LONG cchString, LONG dwFlags,;
	STRING @pbBinary, LONG @pcbBinary,;
	LONG pdwSkip, LONG pdwFlags
  * 
 ENDPROC


 * encodeString
 * Toma un string y lo convierte en base64
 *
 PROCEDURE encodeString(pcString)
  LOCAL nFlags, nBufsize, cDst
  nFlags=1  && base64
  nBufsize=0
  CryptBinaryToString(@pcString, LEN(pcString),m.nFlags, NULL, @nBufsize)
  cDst = REPLICATE(CHR(0), m.nBufsize)
  IF CryptBinaryToString(@pcString, LEN(pcString), m.nFlags,@cDst, @nBufsize) = 0
   RETURN ""
  ENDIF
  RETURN cDst
 ENDPROC
 
 
 * decodeString
 * Toma una cadena en BAse64 y devuelve la cadena original
 *
 FUNCTION decodeString(pcB64)
  LOCAL nFlags, nBufsize, cDst
  nFlags=1  && base64
  nBufsize=0
  pcB64 = STRT(STRT(STRT(pcB64,"\/","/"),"\u000d",CHR(13)),"\u000a",CHR(10))
  CryptStringToBinary(@pcB64, LEN(m.pcB64),nFlags, NULL, @nBufsize, 0,0)
  cDst = REPLICATE(CHR(0), m.nBufsize)
  IF CryptStringToBinary(@pcB64, LEN(m.pcB64),nFlags, @cDst, @nBufsize, 0,0) = 0
   RETURN ""
  ENDIF
  RETURN m.cDst
 ENDPROC 
 
 
 * encodeFile
 * Toma un archivo y lo codifica en base64
 *
 PROCEDURE encodeFile(pcFile)
  IF NOT FILE(pcFile)
   RETURN ""
  ENDIF
  RETURN THIS.encodeString(FILETOSTR(pcFile))
 ENDPROC 
 
 
 * decodeFile
 * Toma una cadena base64, la decodifica y crea un archivo con el contenido
 *
 PROCEDURE decodeFile(pcB64, pcFile)
  LOCAL cBuff
  cBuff = THIS.decodeString(pcB64)
  STRTOFILE(cBuff, pcFile)
 ENDPROC
 *
ENDDEFINE
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox