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

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem por rochinha »

Amiguinhos,

Encontrei no meu arquivo de funções. Não lembro de ter usado, mas vai que alguém precise.

Código: Selecionar todos

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

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

Mensagem por lugab »

Rochinha,

qual a finalidade desse teste ?
lugab
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

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

Mensagem por Claudio Soto »

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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

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

Mensagem por asimoes »

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

Código: Selecionar todos

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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

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

Mensagem por asimoes »

Usamos essa função:

Código: Selecionar todos

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

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

Código: Selecionar todos

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

Código: Selecionar todos

****
*   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)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

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

Mensagem por Claudio Soto »

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

Código: Selecionar todos

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder