Página 1 de 1

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

Enviado: 30 Abr 2018 20:42
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.

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

Enviado: 01 Mai 2018 17:21
por lugab
Rochinha,

qual a finalidade desse teste ?

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

Enviado: 02 Mai 2018 12:36
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.

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

Enviado: 02 Mai 2018 15:11
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

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

Enviado: 02 Mai 2018 19:52
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

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

Enviado: 02 Mai 2018 20:13
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" )

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

Enviado: 02 Mai 2018 20:25
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"

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

Enviado: 02 Mai 2018 21:06
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.