Page 1 of 1

HB_Base64Decode en xHarbour

Posted: Fri Jul 21, 2017 11:17 pm
by Willi Quintana
Hola amigos.
Esta función HB_Base64Decode() no existe en xHarbour, o que LIb debo enlazar??
trabajo con xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 9445) y con Borland C++ 5.82 for Win32

Salu2

Re: HB_Base64Decode en xHarbour

Posted: Sat Jul 22, 2017 5:31 pm
by VitalJavier
Encontre en el foro unas funciones (no se de quien son)
y para lo que necesite me funcionaron, si las quieres te las pongo aqui.

Re: HB_Base64Decode en xHarbour

Posted: Sun Jul 23, 2017 4:20 am
by Willi Quintana
Te agradezco,,, aquí esta bien,. así sirve a quien lo requiera
Gracias..

Re: HB_Base64Decode en xHarbour

Posted: Sun Jul 23, 2017 3:19 pm
by VitalJavier
Espero y el Dueño no se moleste
y tambien que te funcione.

Code: Select all

FUNCTION StrToBase64( cTexte )
*******************
* Conversion en base 64 de la chaine cTexte

* Un alphabet de 65 caractères est utilisé pour permettre la représentation de 6 bits par caractère :
* "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

* Le '=' (65e caractère) est utilisé dans le processus de codage pour les caractères finaux.

LOCAL cTexte64 := ""
LOCAL X
LOCAL cHex
DO WHILE !( cTexte == "" )
cHex := ""

* Le processus de codage représente des groupes de 24 bits de données en entrée par une chaîne en sortie de 4 caractères codés.
* En procédant de gauche à droite, un groupe de 24 bits est créé en concaténant 3 octets (8 bits par octet).
FOR X := 1 TO 3
* Conversion de chaque caractère en chaine binaire de 8 octets
cHex += CarToBin( LEFT(cTexte, 1) )
IF LEN(cTexte) > 1
cTexte := SUBSTR(cTexte, 2)
ELSE
cTexte := ""
EXIT
ENDIF
NEXT X

* Ces 24 bits (ici contenus dans cHex, ou au moins un multiple) sont traités comme 4 groupes concaténés de 6 bits chacun convertis
* en un unique caractère dans l'alphabet de la base 64.

* Chaque groupe de 6 bits est utilisé comme index dans la table des caractères de la base 64.
* Le caractère référencé par l'index correspondant est utilisé comme codage de ce groupe de 6 bits.

FOR X := 1 TO 4

IF SUBSTR(cHex, ( (X - 1) * 6) + 1 ) == ""
cTexte64 += REPLICATE("=", 4 - X + 1)
EXIT
ELSE

* Un traitement spécial est effectué si moins de 24 bits sont disponibles à la fin des données
* à coder. Aucun bit ne restant non-codé,
* si moins de 24 bits sont disponibles alors des bits à zéro sont ajoutés à la droite des données
* pour former un nombre entier de groupes de 6 bits.
IF LEN( cHex ) % 6 > 0
* Ajout des bits à zéro
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 )
*********************
* décodage dun texte codé en 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 )
****************
* Renvoie le caractère correspondant en base 64
LOCAL nPos := ASC( BinToCar( @cBin ) ) + 1
RETURN SUBSTR( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", nPos, 1)

**************
FUNCTION Hex64( carac64 )
**************
* Renvoie le caractère correspondant en base 64
LOCAL cCodeAsc := CHR( AT(carac64, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ) -1 )
RETURN SUBSTR( CarToBin( @cCodeAsc ) , 3, 6)

*****************
FUNCTION CarToBin( carac, lInverse )
*****************
* Renvoie le caractère correspondant dans une chaine binaire (composée de 0 et 1) de 8 bits

#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 )
* Retourne la chaine binaire en ayant reçu le caractère ASCII
cToHex := str2Hex( carac )
RETURN aBin[ AT( LEFT(cToHex,1), cHexa ) ] + aBin[ AT( SUBSTR(cToHex,2), cHexa ) ]
ELSE
* Retourne le caractère ASCII en ayant reçu la chaine binaire
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. )

 
Saludos.

Re: HB_Base64Decode en xHarbour

Posted: Mon Jul 24, 2017 2:19 pm
by karinha

Code: Select all

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL cString := "xOraClip"
   LOCAL cBase64 := HB_Base64Encode( cString, Len( cString ) )

   // xHarbour:
   ? cBase64                     // result: eEhhcmJvdXI==

   ? HB_Base64Decode( cBase64 )  // result: xOraClip

RETURN NIL

// fin
 
Saludos.

Re: HB_Base64Decode en xHarbour

Posted: Mon Jul 24, 2017 2:40 pm
by karinha

Re: HB_Base64Decode en xHarbour

Posted: Wed Dec 18, 2019 9:59 pm
by goosfancito
karinha wrote:

Code: Select all

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL cString := "xOraClip"
   LOCAL cBase64 := HB_Base64Encode( cString, Len( cString ) )

   // xHarbour:
   ? cBase64                     // result: eEhhcmJvdXI==

   ? HB_Base64Decode( cBase64 )  // result: xOraClip

RETURN NIL

// fin
 
Saludos.
pero en que libreria esta?

Re: HB_Base64Decode en xHarbour

Posted: Thu Dec 19, 2019 5:25 pm
by carlos vargas
tanto en harbour con en xharbour, por favor incluya esta linea

Code: Select all

#include "hbcompat.ch"
este archivo de cabecera tiene la redefinición de los nombre de un grupo de funciones que se llama de forma diferente en ambos compiladores, con lo cual se resuelve la mayoría de los mensaje de error de funciones no encontradas.
en el caso de harbour creo que ese archivo de cabecera esta en contrib\xhb por lo que deberan incluir también esa lib.

Code: Select all


#ifdef __XHARBOUR__

   #if defined( __PLATFORM__Windows ) .AND. !defined( __PLATFORM__WINDOWS )
      #define __PLATFORM__WINDOWS
   #endif
   #if defined( __PLATFORM__Linux ) .AND. !defined( __PLATFORM__LINUX )
      #define __PLATFORM__LINUX
   #endif

   #xtranslate hb_ScrMaxRow()              => gtInfo( HB_GTI_SCREENHEIGHT )
   #xtranslate hb_ScrMaxCol()              => gtInfo( HB_GTI_SCREENWIDTH )
   #xtranslate MaxRow(.T.)                 => gtInfo( HB_GTI_SCREENHEIGHT )
   #xtranslate MaxCol(.T.)                 => gtInfo( HB_GTI_SCREENWIDTH )

   #xtranslate hb_dbPack()                 => __dbPack()
   #xtranslate hb_dbZap()                  => __dbZap()
   #xtranslate hb_dbDrop([<x,...>])        => dbDrop(<x>)
   #xtranslate hb_dbExists([<x,...>])      => dbExists(<x>)
   #xtranslate hb_FieldLen([<x>])          => FieldLen(<x>)
   #xtranslate hb_FieldDec([<x>])          => FieldDec(<x>)
   #xtranslate hb_FieldType([<x>])         => FieldType(<x>)
....
 
por lo menos en mi versión de harbour son funciones del core y en xharbour esta en tip.lib y se llaman de igual forma.