Página 1 de 1

Usar caracteres especiais em strings no Harbour

Enviado: 13 Mar 2012 10:49
por Jairo Maia
Olá  Pessoal,

Em alguns sistemas, tenho alguns dados criptografados que fazem parte do fonte, o qual é personalizado para cada cliente, a saber: razao/nome, cpf/cnpj, serial e número de registro.

O sistema de gerenciamento interno, automaticamente gera um arquivo .CH na pasta do respectivo sistema com estas informações criptografadas, e o PRG principal faz a inserção deste .CH com uma chamado assim: #include "dadoloja.ch".

Ao mesmo tempo, o gerenciador interno atualiza a data e hora do PRG principal que é quem insere estes dados atualizados na compilação. Tudo isso funciona ok.

Ocorre que em Harbour, ele não entende que se trata de string, que está  envelopada, e que portanto deveria aceitar qualquer coisa dentro do envelope, mas não é o que ocorre.

Posso envelopar uma string usando apóstrofe ('), aspas (") ou colchetes ([]). Neste caso, uso colchete porque pode haver apóstrofe ou aspas na criptografia.

Como usar no Harbour este envelopamento? Alguém tem alguma dica? Abaixo um pequeno exemplo do que ocorre:

Código: Selecionar todos

/*
  Para compilar: hbmk2 -lxhb
*/

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

Function Main()
  Local cSenha, cRazao

  HB_SETCODEPAGE('PT850')
  HB_LANGSELECT('PT')

  Clea Screen

  cSenha := "654321B"
  cRazao := "CONVENIÊNCIA INFORMAÇÃO E SERVIÇO"

  cRazao := HB_CRYPT( cRazao, cSenha )
  MemoWrit( "dados.txt", cRazao )  // grava em arquivo txt
  ? cRazao

  cRazao := HB_DECRYPT( cRazao, cSenha )
  ? cRazao

  /*
     Abaixo, como preciso usar, mas não é possível.
  */
  //cRazao := HB_DECRYPT( [© ü%Ú×7¦+3°ýttô53=‘J>kä@b] )
  //? cRazao
Return Nil

Usar caracteres especiais em strings no Harbour

Enviado: 13 Mar 2012 11:04
por Pablo César
Posso envelopar uma string usando apóstrofe ('), aspas (") ou colchetes ([]). Neste caso, uso colchete porque pode haver apóstrofe ou aspas na criptografia.

Como usar no Harbour este envelopamento? Alguém tem alguma dica?
Todos sabemos que em Clipper as aspas simples ou duplas servem para determinar que trata-se de dados do tipo caracter ou string como dizemos em Clipper.
Então se o problema é que as vezes o dado encriptado vem um desses caracteres, você precisará converter na sua rotina de decriptação, o conteúdo da aspas duplas para Chr(34) mas esta terá que estar entre aspas simples e para o caso do conteúdo encryptado for aspa simples deverá converter para Chr(39) e delimitar a string entre aspas duplas (o contrário).

Ou então, converter todo conteúdo do encryptado em valor ASCII acompanhado com "Chr("+valor_ASCII+")" isso na rotina de decryptação.

Exemplo para este caso encryptado:

Valor encryptado: © ü%Ú×7¦+3°ýttô53=‘J>kä@b

Valor a ser convertido em string:
Chr(114)+Chr(184)+Chr(110)+Chr(032)+Chr(129)+Chr(037)+Chr(122)+Chr(233)+;
Chr(120)+Chr(158)+Chr(055)+Chr(221)+Chr(043)+Chr(051)+Chr(248)+Chr(236)+;
Chr(116)+Chr(116)+Chr(147)+Chr(034)+Chr(115)+Chr(053)+Chr(051)+Chr(061)+;
Chr(039)+Chr(062)+Chr(107)+Chr(132)+Chr(064)+Chr(098)


Exemplo de assignar um valor do tipo caracter a uma variável:

Código: Selecionar todos

var1:=Chr(114)+Chr(184)+Chr(110)+Chr(032)+Chr(129)+Chr(037)+Chr(122)+Chr(233)+;
Chr(120)+Chr(158)+Chr(055)+Chr(221)+Chr(043)+Chr(051)+Chr(248)+Chr(236)+;
Chr(116)+Chr(116)+Chr(147)+Chr(034)+Chr(115)+Chr(053)+Chr(051)+Chr(061)+;
Chr(039)+Chr(062)+Chr(107)+Chr(132)+Chr(064)+Chr(098)
? var1
Em outras palavras, a minha dica é você interpretar caracter a caracter gravado pelo memowrit e converter em:
"Chr("+valor_ASCII+")" onde a variável valor_ASCII é obtida pela função ASC() e depois re-interpretada através de MACRO. Exemplo:

Código: Selecionar todos

var1:="Chr(114)+Chr(184)+Chr(110)+Chr(032)+Chr(129)+Chr(037)+Chr(122)+Chr(233)+Chr(120)+Chr(158)+Chr(055)+Chr(221)+Chr(043)+Chr(051)+Chr(248)+Chr(236)+Chr(116)+Chr(116)+Chr(147)+Chr(034)+Chr(115)+Chr(053)+Chr(051)+Chr(061)+Chr(039)+Chr(062)+Chr(107)+Chr(132)+Chr(064)+Chr(098)"
var2:=(&(var1))
? var2

Usar caracteres especiais em strings no Harbour

Enviado: 13 Mar 2012 15:50
por Jairo Maia
Olá Pablo,

A questão de tratamento de caracteres usando aspas simples (não apóstrofe como eu disse antes), aspas duplas e colchete, eu não tenho dificuldade, uso isso até com certa frequência para destacar palavras em mensagens. O problema é que o Harbour não aceita a forma que eu usava em Clipper quanto a string criptografada, e acusava string ilegal, mesmo estando delimitada (envelopada) pelos caracteres de uso de string.

Agora, a solução que você propôs em alterar e usar o CHR() e ASC() foi SHOW DE BOLA. Abaixo um simples exemplo do resultado:

Função para gerar o arquivo .CH

Código: Selecionar todos

/*
  Usar a Lib:  -lxhb
*/

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

Function Main()
 cDadoCH:=""
 cSenha:="654321B"
 cr := CHR(13)+CHR(10)

 HB_SETCODEPAGE('PT850')
 HB_LANGSELECT('PT')
 SET CENTURY ON
 SET DATE BRIT

 Clea Screen

 cCnpj := "11.222.333/001-55"
 cRazao := "CONVENIÊNCIA INFORMAÇÃO E SERVIÇO"
 dDataReg := DATE()

 cLinTmp := ""
 cVarTmp := HB_CRYPT( ALLTRIM( cCnpj ), cSenha )
 FOR i=1 TO Len( cVarTmp )
  cChrTmp := SUBST( cVarTmp, i, 1 )
  cChrTmp := ALLTRIM( STR( ASC(cChrTmp) ) )
  cLinTmp += If( i > 1,"+", "") + "CHR(&cChrTmp.)"
 NEXT
 cDadoCH+="cCnpj:="+cLinTmp+cr

 cLinTmp := ""
 cVarTmp := HB_CRYPT( ALLTRIM( cRazao ), cSenha )
 FOR i=1 TO Len( cVarTmp )
  cChrTmp := SUBST( cVarTmp, i, 1 )
  cChrTmp := ALLTRIM( STR( ASC(cChrTmp) ) )
  cLinTmp += If( i > 1,"+", "") + "CHR(&cChrTmp.)"
 NEXT
 cDadoCH+="cRazao:="+cLinTmp+cr

 cLinTmp := ""
 cVarTmp := HB_CRYPT( DTOC( dDataReg ), cSenha )
 FOR i=1 TO Len( cVarTmp )
  cChrTmp := SUBST( cVarTmp, i, 1 )
  cChrTmp := ALLTRIM( STR( ASC(cChrTmp) ) )
  cLinTmp += If( i > 1,"+", "") + "CHR(&cChrTmp.)"
 NEXT
 cDadoCH+="cDataReg:="+cLinTmp+cr

 MemoWrit( "dadoloja.ch", cDadoCH )

Return Nil
Função que usa o arquivo .CH

Código: Selecionar todos

/*
  Usar a Lib: -lxhb
*/

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850

Function Main()

 #include "dadoloja.ch"

 HB_SETCODEPAGE('PT850')
 HB_LANGSELECT('PT')
 SET CENTURY ON
 SET DATE BRIT

 cSenha:="654321B"

 Clea Screen

 ?
 ? cCnpj
 ? cRazao
 ? cDataReg
 ?
 ? HB_DECRYPT( cCnpj, cSenha )
 ? HB_DECRYPT( cRazao, cSenha )
 ? HB_DECRYPT( cDataReg, cSenha )
 ?

Return Nil
Muito Obrigado Pablo.
PROBLEMA RESOLVIDO