Clipper On Line • Ver Tópico - Converter um Zip para o tipo Binário
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Converter um Zip para o tipo Binário

17 Mai 2017 14:37

Estou desenvolvendo a comunicação do meu sistema para enviar dados de Redução Z para o Fisco. No manual solicitaram que seja feito o envio do arquivo Xml Zipado. Com isso devemos converter esse Zip para o tipo Binário primeiramente. Alguém saberia como posso proceder para fazer essa conversão?

Converter um Zip para o tipo Binário

19 Mai 2017 09:04

Amigos, consegui a implementação da função que faz a Codificação na base 64. Os passos que utilizei foram os seguintes:

  • Importar o arquivo em anexo para o compilador. No meu caso inclui na pasta "...\Borland\BCC55\Include".
  • Criar uma função em C contendo o seguinte código:
    Código:
    /*
    * Proyecto: FARMACIA
    * Fichero: Module2.c
    * Descripción:
    * Autor:
    * Fecha: 05-18-2017
    */

    /*
    * $Id: base64.c 9999 2014-05-19 10:56:11Z zsaulius $
    */

    #define HB_THREAD_OPTIMIZE_STACK
    #ifndef HB_THREAD_SUPPORT
    #define HB_THREAD_STUB
    #endif

    // #include "thread.h"
    #include "base64.h"
    #include "hbapi.h"
    #include "hbapifs.h"

    #define XTY62  '+'
    #define XTY63  '/'
    #define XTYPAD '='

    static char Base64Table[ 64 ] = {
       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',   'P',
       'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e',   'f',
       'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',   'v',
       'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', XTY62, XTY63
    };

    char * Base64Encode( const unsigned char * pcCode, unsigned int uCodeLen )
    {
       unsigned int i, j = 0, tailCnt = uCodeLen % 3;
       char *       pRet = ( char * ) hb_xgrab( 4 * ( ( uCodeLen + 2 ) / 3 ) + 1 );

       //uCodeLen/3 segments.
       for( i = 0; i < uCodeLen / 3; i++, pcCode += 3 )
       {
          pRet[ j++ ] = Base64Table[     pcCode[ 0 ]          >> 2 ];
          pRet[ j++ ] = Base64Table[ ( ( pcCode[ 0 ] & 0x03 ) << 4 ) | ( pcCode[ 1 ] >> 4 ) ];
          pRet[ j++ ] = Base64Table[ ( ( pcCode[ 1 ] & 0x0F ) << 2 ) | ( pcCode[ 2 ] >> 6 ) ];
          pRet[ j++ ] = Base64Table[     pcCode[ 2 ] & 0x3F ];
       }

       if( tailCnt )
       {
          pRet[ j++ ] = Base64Table[ pcCode[ 0 ] >> 2 ];

          if( tailCnt == 1 )
          {
             pRet[ j++ ] = Base64Table[ ( pcCode[ 0 ] & 0x03 ) << 4 ];
             pRet[ j++ ] = XTYPAD;
          }
          else if( tailCnt == 2 )
          {
             pRet[ j++ ] = Base64Table[ ( ( pcCode[ 0 ] & 0x03 ) << 4 ) | ( pcCode[ 1 ] >> 4 ) ];
             pRet[ j++ ] = Base64Table[   ( pcCode[ 1 ] & 0x0F ) << 2 ];
          }
          pRet[ j++ ] = XTYPAD;
       }

       pRet[ j ] = '\0';

       return pRet;
    }

    //assume input != NULL.
    unsigned char * Base64Decode( const char * pcszInput, unsigned int * puOutLen )
    {
       int             iSize = strlen( pcszInput ) + 1;
       char            map[ 256 ], i, c, * pBuf = ( char * ) hb_xgrab( iSize );
       unsigned int    j, uBufLen;
       unsigned int    uSegCnt;
       unsigned int    uTailCnt;
       unsigned char * pRet, * pTmp;
       char *          ptr;

       memset( map, 0xFF, 256 );
       for( i = 'A', map[(unsigned char) 'A' ] =  0; i <  'Z'; map[(unsigned char) i + 1 ] = map[(unsigned char) i ] + 1, i++ );
       for( i = 'a', map[(unsigned char) 'a' ] = 26; i <= 'z'; map[ (unsigned char)i + 1 ] = map[(unsigned char) i ] + 1, i++ );
       for( i = '0', map[(unsigned char) '0' ] = 52; i <= '9'; map[ (unsigned char)i + 1 ] = map[(unsigned char) i ] + 1, i++ );
       map[ XTY62 ] = 62; map[ XTY63 ] = 63;

       uBufLen = 0;
       c       = pcszInput[ 0 ];
       while( c != '\0' && c != XTYPAD )
       {
          pBuf[ uBufLen ] = map[ (unsigned char)c ];

          if( pBuf[ uBufLen ] >= 0 )
             uBufLen++;
          c = *( ++pcszInput );
       }

       pBuf[ uBufLen ] = '\0';

       uSegCnt = uBufLen / 4;
       pRet    = ( unsigned char * ) hb_xgrab( ( uSegCnt + 1 ) * 3 );
       pTmp    = pRet;

       //full segments.
       ptr = pBuf;
       for( j = 0; j < uSegCnt; j++ )
       {
          *pTmp++ = ( ( ptr[ 0 ] << 2 ) | ( ptr[ 1 ] >> 4 ) );
          *pTmp++ = ( ( ptr[ 1 ] << 4 ) | ( ptr[ 2 ] >> 2 ) );
          *pTmp++ = ( unsigned char ) ( ( ptr[ 2 ] << 6 ) |   ptr[ 3 ] );
          ptr    += 4;
       }

       *puOutLen = uSegCnt * 3;
       uTailCnt  = uBufLen % 4;

       if( uTailCnt == 2 )
       {
          *pTmp = ( ( ptr[ 0 ] << 2 ) | ( ptr[ 1 ] >> 4 ) );
          ( *puOutLen )++;
       }
       else if( uTailCnt == 3 )
       {
          *pTmp++        = ( ( ptr[ 0 ] << 2 ) | ( ptr[ 1 ] >> 4 ) );
          *pTmp          = ( ( ptr[ 1 ] << 4 ) | ( ptr[ 2 ] >> 2 ) );
          ( *puOutLen ) += 2;
       }

       hb_xfree( pBuf );

       return pRet;
    }

    HB_FUNC( HB_BASE64ENCODE )
    {
       HB_THREAD_STUB
       const unsigned char * pcCode   = ( const unsigned char * ) hb_parcx( 1 );
       unsigned int          uCodeLen = hb_parni( 2 );
       char *                szBase64Encode;

       szBase64Encode = Base64Encode( pcCode, uCodeLen );
       hb_retcAdopt( szBase64Encode );
    }

    HB_FUNC( HB_BASE64DECODE )
    {
       HB_THREAD_STUB
       const char *    pcCode = hb_parcx( 1 );
       unsigned int    uCodeLen;
       unsigned char * szBase64Encode;

       szBase64Encode = Base64Decode( pcCode, &uCodeLen );

       hb_retclenAdopt( ( char * ) szBase64Encode, uCodeLen );
    }

    static long filelength( int handle )
    {
       long nEnd   = hb_fsSeek( handle, 0, 2 );
       long nStart = hb_fsSeek( handle, 0, 0 );

       return nEnd - nStart;
    }

    static char * filetoBuff( char * f, const char * s )
    {

       int i;
       int fh = hb_fsOpen( s, 2 );

       i      = hb_fsReadLarge( fh, ( BYTE * ) f, filelength( fh ) );
       f[ i ] = '\0';
       hb_fsClose( fh );
       return f;
    }

    HB_FUNC( HB_BASE64ENCODEFILE )
    {
       HB_THREAD_STUB
       const char *   szInFile    = hb_parcx( 1 );
       const char *   szOutFile   = hb_parcx( 2 );
       const char *   pcCode;
       char *         FromBuffer;
       int            fh;
       int            iSize;
       char *         szBase64Encode;

       fh             = hb_fsOpen( szInFile, 2 );
       iSize          = filelength( fh );
       FromBuffer     = ( char * ) hb_xgrab( iSize + 1 );
       hb_fsClose( fh );
       pcCode         = ( char * ) filetoBuff( FromBuffer, szInFile );
       szBase64Encode = Base64Encode( ( const unsigned char * ) pcCode, iSize );
       fh             = hb_fsCreate( szOutFile, 0 );
       hb_fsWriteLarge( fh, szBase64Encode, strlen( szBase64Encode ) );
       hb_fsClose( fh );
       hb_xfree( FromBuffer );
       hb_xfree( szBase64Encode );
    }

    HB_FUNC( HB_BASE64DECODEFILE )
    {
       HB_THREAD_STUB
       const char *   szInFile    = hb_parcx( 1 );
       const char *   szOutFile   = hb_parcx( 2 );
       const char *   pcCode;
       char *         FromBuffer;
       int            fh;
       unsigned int   iSize;
       char *         szBase64Encode;

       fh             = hb_fsOpen( szInFile, 2 );
       iSize          = filelength( fh );
       FromBuffer     = ( char * ) hb_xgrab( iSize + 1 );
       hb_fsClose( fh );
       pcCode         = ( char * ) filetoBuff( FromBuffer, szInFile );
       szBase64Encode = ( char * ) Base64Decode( pcCode, &iSize  );
       fh             = hb_fsCreate( szOutFile, 0 );
       hb_fsWriteLarge( fh, szBase64Encode, strlen( szBase64Encode ) );
       hb_fsClose( fh );
       hb_xfree( FromBuffer );
    }


  • Chamar normalmente a função para Codificar o arquivo desejado. No meu caso utilizei somente a "HB_BASE64ENCODEFILE" mas pelo código é possível utilizar mais 3 funções de codificação e decodificação: "HB_BASE64DECODEFILE", "HB_BASE64ENCODE" e "HB_BASE64DECODE".

Fica aqui minha contribuição para o fórum.
Anexos
base64.rar
base64.c da classe para implementar no projeto.
(340 Bytes) Baixado 113 vezes

Converter um Zip para o tipo Binário

21 Mai 2017 15:52

Obrigado pela contribuição.

Tem como postar um exemplo prático?

Converter um Zip para o tipo Binário

21 Mai 2017 16:16

Segue o seu exemplo modificado para funcionar com harbour 3.4 + MinGW

ROTINA.C
(5.83 KiB) Baixado 104 vezes

Converter um Zip para o tipo Binário

22 Mai 2017 09:03

No meu caso precisei Zipar um arquivo XML, transformar esse arquivo em uma string para o formato binário na base de 64 e fazer o envio para o servidor.

Como exemplo realizei a chamada da Função "HB_BASE64ENCODEFILE" passando como parâmetro o nome do arquivo que seria codificado e o nome do arquivo que salva o código do zip convertido:

Um exemplo: Meu arquivo que será codificado está no diretório "D:", logo passo para o primeiro parâmetro da minha função o caminho "D:\XmlEnvioRZ.zip". A função de Encode gera um arquivo TXT contendo o código do zip codificado, logo o segundo parâmetro da função é o nome do arquivo que será gerado ao executá-la, utiliza-se por exemplo "D:\xmlCodificado.txt"

Caso utilize um método de decodificação o resultado é novamente o arquivo zipado.
Anexos
XmlCodificado.txt
Xml codificado após a função
(4.15 KiB) Baixado 91 vezes
xmlEnvioRZ.zip
Zip do XML que será convertido
(3.11 KiB) Baixado 102 vezes

Converter um Zip para o tipo Binário

23 Jun 2017 08:41

Boa, vou utilizar e depois deixo meu comentário. Obrigado
_____________________________________________________________________________________________________
"Cada um trabalha como quer, mas pagar imposto temos que ser iguais! nesse país não há trégua..."

Converter um Zip para o tipo Binário

21 Nov 2017 18:46

Boa noite a todos.

Não tem função nativa do Harbour para realizar essa conversão?

Precisando dessa dica, tenho que converter um .zip e um .pdf para um tal de Encode 64.

Desde já agradeço a ajuda.

Sds,
Mario.

Converter um Zip para o tipo Binário

23 Nov 2017 12:32

Boa tarde.

Aliás, vi que existe uma função chamada Hb_Base64EncodeFile() que converte arquivos para esse formato "Encode 64" se é que é assim que se chama.

Pergunta: Tem essa função no Harbour? Procurando em manuais on-line não estou encontrando.

Não é uma coisa nova, deve haver algo similiar, se não tem a função no Harbour.

Desde já, agradeço a dica.

Abraço a todos,
Mario.

Converter um Zip para o tipo Binário

24 Nov 2017 13:41

Boa tarde.

Tentei usar a função Hb_Base64EncodeFile(), mas ela não deve mesmo fazer parte do Harbour. Mas tem no xHarbour... Incrível não ter isso pronto pra uso.

Essa alternativa postada, como posso colar no meu programa? Compila em C ou pode compilar no Harbour mesmo? Pra variar, não tenho experiência com isso, se alguém puder dar uma dica, desde já agradeço.

Saudações,
Mario.

Converter um Zip para o tipo Binário

28 Nov 2017 11:42

Boa tarde a todos.

Consegui um utilitário que faz a conversão de arquivos para binário. Testei com um PDF e funcionou bem. Por ser um .exe dá pra embutir no programa e executar com o Run.

Se quiserem, anexo ele pra galera testar. Vai me resolver um problemão.

Sds,
Mario.
Postar uma resposta