Hola a todos.
Estoy buscando alguna funcion que me permita codificar y decodificar archivos xml en base64 para Harbour y no la encuentro, quizas alguien lo tenga y me lo pueda facilitar.
Muchas gracias
Jorge Jaurena
Perdón por la pregunta: ¿ Por que hay que codificar/decodificar archivos xml ?Jorge Jaurena wrote:Estoy buscando alguna funcion que me permita codificar y decodificar archivos xml...
* BASE64.PRG
* Creation le 30/12/2008
* Auteur Badara Thiam
* Derniere modification le 25/09/2009 à 16:35:37
* Cambio 25/09/2009 realizado en StrToBase64 ( )
* Resuelve un error de conversión se produce cuando :
* ( El número de caracteres de la cadena multiplicado por 8 ) no es un múltiplo de 6
*******************
FUNCTION StrToBase64( cTexte )
*******************
* Conversión de base 64 de la cadena de ctext
* Un alfabeto de 65 caracteres se utiliza para permitir la representación de 6 bits por carácter :
* "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
* El '=' ( carácter 65a ) se utiliza en el proceso de codificación para los caracteres finales.
LOCAL cTexte64 := ""
LOCAL X
LOCAL cHex
DO WHILE !( cTexte == "" )
cHex := ""
* El proceso de codificación representa grupos de datos de entrada de 24 bits por una cadena de salida de 4 caracteres codificados .
* Procediendo de izquierda a derecha , un grupo de 24 bits se crea mediante la concatenación de tres bytes ( 8 bits por byte ) .
FOR X := 1 TO 3
* Convertir cada cadena de caracteres binarios de 8 bytes
cHex += CarToBin( LEFT(cTexte, 1) )
IF LEN(cTexte) > 1
cTexte := SUBSTR(cTexte, 2)
ELSE
cTexte := ""
EXIT
ENDIF
NEXT X
* Estos 24 bits (en este caso contenía en cHex , o al menos un múltiple) se tratan como 4 grupos concatenados de 6 bits cada convertidos
* En un solo carácter en el alfabeto de la base 64 .
* Cada grupo de 6 bits se utiliza como un índice en la tabla de caracteres de la base 64 .
* El carácter referencia el índice correspondiente se utiliza como la codificación de este grupo de 6 bits.
FOR X := 1 TO 4
IF SUBSTR(cHex, ( (X - 1) * 6) + 1 ) == ""
cTexte64 += REPLICATE("=", 4 - X + 1)
EXIT
ELSE
* Procesamiento especial se lleva a cabo si hay menos de 24 bits están disponibles al final de los datos
* Codificación . Sin bits restantes no codificado ,
* Menos de 24 bits están disponibles a continuación, los bits de cero se añaden a la derecha de los datos
* Para formar un número entero de 6 grupos de bits .
IF LEN( cHex ) % 6 > 0
* La adición de bits cero
cHex += REPLICATE("0", 6 - ( LEN( cHex ) % 6 ) )
ENDIF
cTexte64 += Carac64( "00" + SUBSTR(cHex, ( (X - 1) * 6) + 1, 6 ) )
ENDIF
NEXT X
ENDDO
RETURN cTexte64
*********************
FUNCTION Base64ToStr( cTexte64 )
*********************
* La decodificación de un texto codificado de base 64
LOCAL cTexte := ""
LOCAL X
LOCAL cHex
LOCAL cCar
DO WHILE !( cTexte64 == "" )
try
cCar := LEFT(cTexte64,4)
catch
end
cHex := ""
try
FOR X := 1 TO 4
IF SUBSTR(cCar, X, 1 ) != "="
cHex += Hex64( SUBSTR(cCar, X, 1 ) )
ELSE
EXIT
ENDIF
NEXT X
catch
end
FOR X := 1 TO 3
IF SUBSTR(cHex, ( (X - 1) * 8) + 1 ) == ""
EXIT
ELSE
cTexte += BinToCar( SUBSTR(cHex, ( (X - 1) * 8) + 1, 8 ) )
ENDIF
NEXT X
IF LEN(cTexte64) > 4
cTexte64 := SUBSTR(cTexte64, 5)
ELSE
cTexte64 := ""
ENDIF
ENDDO
RETURN cTexte
****************
FUNCTION Carac64( cBin )
****************
* Devuelve el carácter de base 64 que corresponde
LOCAL nPos := ASC( BinToCar( @cBin ) ) + 1
RETURN SUBSTR( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", nPos, 1)
**************
FUNCTION Hex64( carac64 )
**************
* Devuelve el carácter de base 64 que corresponde
LOCAL cCodeAsc := CHR( AT(carac64, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ) -1 )
RETURN SUBSTR( CarToBin( @cCodeAsc ) , 3, 6)
*****************
FUNCTION CarToBin( carac, lInverse )
*****************
* Devuelve el carácter que corresponde a una cadena binaria ( que consiste en 0 y 1 )8 -bit
#define cHexa "0123456789ABCDEF"
#define aBin {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", ;
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }
LOCAL cToHex
IF EMPTY( lInverse )
* Devuelve la cadena binaria de haber recibido el carácter ASCII
cToHex := str2Hex( carac )
RETURN aBin[ AT( LEFT(cToHex,1), cHexa ) ] + aBin[ AT( SUBSTR(cToHex,2), cHexa ) ]
ELSE
* Devuelve el carácter ASCII de haber recibido la cadena binaria
cToHex := SUBSTR(cHexa, ASCAN(aBin, LEFT(carac,4 ) ), 1 ) ;
+ SUBSTR(cHexa, ASCAN(aBin, SUBSTR(carac,5,4 ) ), 1 )
RETURN Hex2str( cToHex )
ENDIF
RETURN NIL
*****************
FUNCTION BinToCar( cBin )
*****************
RETURN CarToBin( @cBin, .T. )
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: SantaCroya and 49 guests