Clipper On Line • Ver Tópico - Converter um Zip para o tipo Binário

Converter um Zip para o tipo Binário

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Converter um Zip para o tipo Binário

Mensagempor leohpaim » 17 Mai 2017 15: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?

Leonardo Henrique Paim
Desenvolvedor de Software


"A primeira regra de qualquer tecnologia utilizada nos negócios é que a automação aplicada a uma operação eficiente aumentará a eficiência. A segunda é que a automação aplicada a uma operação ineficiente aumentará a ineficiência."
Bill Gates
Avatar de usuário

leohpaim
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 02 Mai 2017 14:35
Cidade/Estado: Lagoa da Prata - MG
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

Converter um Zip para o tipo Binário

Mensagempor leohpaim » 19 Mai 2017 10: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:
    /*
    * 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 11 vezes

Leonardo Henrique Paim
Desenvolvedor de Software


"A primeira regra de qualquer tecnologia utilizada nos negócios é que a automação aplicada a uma operação eficiente aumentará a eficiência. A segunda é que a automação aplicada a uma operação ineficiente aumentará a ineficiência."
Bill Gates
Avatar de usuário

leohpaim
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 02 Mai 2017 14:35
Cidade/Estado: Lagoa da Prata - MG
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

Converter um Zip para o tipo Binário

Mensagempor asimoes » 21 Mai 2017 16:52

Obrigado pela contribuição.

Tem como postar um exemplo prático?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3243
Data de registro: 26 Abr 2007 17:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 166 vezes
Mens.Curtidas: 130 vezes

Converter um Zip para o tipo Binário

Mensagempor asimoes » 21 Mai 2017 17:16

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

ROTINA.C
(5.83 KiB) Baixado 13 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 3243
Data de registro: 26 Abr 2007 17:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 166 vezes
Mens.Curtidas: 130 vezes

Converter um Zip para o tipo Binário

Mensagempor leohpaim » 22 Mai 2017 10: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 8 vezes
xmlEnvioRZ.zip
Zip do XML que será convertido
(3.11 KiB) Baixado 9 vezes

Leonardo Henrique Paim
Desenvolvedor de Software


"A primeira regra de qualquer tecnologia utilizada nos negócios é que a automação aplicada a uma operação eficiente aumentará a eficiência. A segunda é que a automação aplicada a uma operação ineficiente aumentará a ineficiência."
Bill Gates
Avatar de usuário

leohpaim
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 02 Mai 2017 14:35
Cidade/Estado: Lagoa da Prata - MG
Curtiu: 3 vezes
Mens.Curtidas: 0 vez

Converter um Zip para o tipo Binário

Mensagempor card0z0 » 23 Jun 2017 09: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..."
card0z0
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 9
Data de registro: 08 Mai 2017 17:45
Cidade/Estado: Pelotas/RS
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro