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
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
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.