Clipper On Line • Ver Tópico - Função para teste de CRC de campos DBF.

Função para teste de CRC de campos DBF.

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

Moderador: Moderadores

 

Função para teste de CRC de campos DBF.

Mensagempor rochinha » 30 Abr 2018 20:42

Amiguinhos,

Encontrei no meu arquivo de funções. Não lembro de ter usado, mas vai que alguém precise.
function dbSaveCRC() 
   if dbFieldCRC()
      FieldPut(FCount(),dbCalcCRC())
   end
   return nil

function dbFieldCRC()
   return Right(RTrim(FieldName(FCount())),3) == "CRC"

function dbCalcCRC()
   local cSum := ""
   local f
   local i
   *
   for i := 1 to FCount()-1
       f := FieldGet(i)
       cSum += if(ValType(f) = "C",      f         ,;
               if(ValType(f) = "N",  Str(f,18,6)   ,;
               if(ValType(f) = "D", DtoS(f)        ,;
               if(ValType(f) = "L",   if(f,"1","0"), ""))))
   next
   return .t. // CRC32Calc(cSum)


Não tenho autor ou fonte.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Função para teste de CRC de campos DBF.

Mensagempor lugab » 01 Mai 2018 17:21

Rochinha,

qual a finalidade desse teste ?
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Função para teste de CRC de campos DBF.

Mensagempor rochinha » 02 Mai 2018 12:36

Amiguinhos,

Também não sei, não foi invenção minha, encontrei em meus códigos de funções.

Acho que serve para testar o conteúdo de campos e retornar se confere, pois quando dá pau numa tabela acontece de coisas estranhas serem gravadas em campos que não as comportam, tipo, ter uma série de caracteres, letras, simbolos em campos numéricos, data e lógicos.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Função para teste de CRC de campos DBF.

Mensagempor Claudio Soto » 02 Mai 2018 15:11

Falta la función que calcula el CRC de los datos porque la función dbCalcCRC() lo único que hace es transformar el contenido de todos los campos de un registro en una string.
Falta el codigo de la función:

return CRC32Calc(cSum)

Que seria la función que calcula el CRC de la string. El CRC sirve para verificar la integridad de los datos
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Função para teste de CRC de campos DBF.

Mensagempor asimoes » 02 Mai 2018 19:52

Você pode criar um campo no dbf chamado crc gravar o crc dos campos desse dbf.

Toda vez que você abrir a tabela esse campo crc será lido e depois comparar novamente com crc dos campos que geraram o crc

Campos
Data
Nome
crc

replace crc with crc(Data, Nome)

Na leitura

if crc( Data, Nome) = crc
   ? "Ok"
else
   ? "erro"
endif
â–º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: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Função para teste de CRC de campos DBF.

Mensagempor asimoes » 02 Mai 2018 20:13

Usamos essa função:

iCalculo := ChkSum( G_Usuario->Matricula + G_Usuario->Nome )

IF G_Usuario->ChkSum == iCalculo
   ? "Ok"
ELSE
   ? "Erro"
ENDIF


Gravando o ChkSum
GA_Usuario->ChkSum := ChkSum( GA_Usuario->Matricula + G_Usuario->Nome )


****
*   Gera a string de validação de um registro
*
FUNCTION ChkSum( cRegistro )

LOCAL nCount, nChkSum, cRegAux, nChkAnt

   cRegAux:=""
   FOR nCount:=1 TO Len( cRegistro )
     IF SubStr( cRegistro, nCount, 1 ) <> " "
        cRegAux += SubStr( cRegistro, nCount, 1 )
     ENDIF
   NEXT

   nChkSum := 0
   FOR nCount:=1 TO Len(cRegAux)
     nChkSum += Int( ( Asc( SubStr( cRegAux, nCount, 1 ) ) * ( Len( cRegAux ) * nCount ) ) *33 )
   NEXT

   nChkAnt := nChkSum
   nChkSum := VAL( SubStr( AllTrim( Str( nChkSum ) ), ( Len( AllTrim( Str( nChkSum ) ) ) -2 ), 2 ) + ;
                   SubStr( AllTrim( Str( nChkSum ) ), 1,( Len( AllTrim( Str( nChkSum ) ) ) -2 ) ) )

   *** compatibilidade com try ... except do Delphi ***

   IF nChkSum > 2147483647      // maior tamanho de inteiro do Delphi
      nChkSum := nChkAnt
      nChkSum := ;
          Val( SubStr( ( SubStr( AllTrim( Str( nChkSum ) ), ( Len( AllTrim( Str( nChkSum ) ) ) -2 ), 2 ) +;
               SubStr( AllTrim( Str( nChkSum ) ), 1, ( Len( AllTrim( Str( nChkSum ) ) ) -2 ) ) ), 1, 9 ) )
   ENDIF

   WHILE nChkSum > 65535
     nChkSum := Int( nChkSum / 2 )
   END

RETURN IntToHex( nChkSum, 4 )

****
*   Converte inteiro para hexadecimal
*
FUNCTION IntToHex( nDec, nCasas )

LOCAL cSign, cHex:="", aRestos:={}, nPos, nDig

   IF nDec < 0
      nDec := nDec * -1
      cSign := "-"
   ELSE
      cSign := ""
   ENDIF

   WHILE nDec > 15
      aAdd( aRestos, nDec % 16 )
      nDec := Int( nDec / 16 )
   END
   aAdd( aRestos, nDec )
   FOR nPos := Len( aRestos ) TO 1 STEP -1
      nDig := aRestos[nPos]
      cHex += Chr( nDig + IF( nDig < 10, 48, 55 ) )
   NEXT

RETURN cSign + PADL( cHex, nCasas, "0" )
â–º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: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Função para teste de CRC de campos DBF.

Mensagempor Claudio Soto » 02 Mai 2018 20:25

asimoes escreveu:Você pode criar um campo no dbf chamado crc gravar o crc dos campos desse dbf.

Toda vez que você abrir a tabela esse campo crc será lido e depois comparar novamente com crc dos campos que geraram o crc

Campos
Data
Nome
crc

replace crc with crc(Data, Nome)

Na leitura

if crc( Data, Nome) = crc
   ? "Ok"
else
   ? "erro"
endif

El código de Rochinha trabaja de esa forma, esta línea del código verificasu el último campo se llama CRC

function dbFieldCRC()
return Right(RTrim(FieldName(FCount())),3) == "CRC"
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Função para teste de CRC de campos DBF.

Mensagempor JoséQuintas » 02 Mai 2018 21:06

Só pra complementar:

Uma finalidade é segurança.
Detectar se alguém mexeu nos arquivos por fora do aplicativo.
Isso é importante em determinados aplicativos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 16 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro