O mais correto seria validar inicialmente a máscara contra o número do CRC. Eu até faço isso, mas não pude anexar minha função de validação de máscara.
Código: Selecionar todos
//**************************************************************************************************
function ValidCRC(cCRC)
local cSig := "AC,AL,AM,AP,BA,CE,CF,DF,ES,FR,GB,GO,LG,MA,MG,MS,MT,NI,NR,PA,PB,PE,PF,PI,PJ,PR,RJ,RN,RO,RR,RS,SC,SE,SP,TO"
local cCod := "26,09,01,25,11,05,24,21,12,99,22,20,30,03,18,23,19,98,21,02,07,08,50,04,51,15,13,06,29,27,17,16,10,14,28"
local cSit := "OTSPK"
local nMul := 2
local nTot := 0
local cStr
local i
cCRC := Upper(AllTrim(cCRC))
if At(Left(cCRC,2),cSig) > 0
cStr := "1" + SubStr(cCod,At(Left(cCRC,2),cSig),2) + SubStr(cCRC,3,6) + Str(At(SubStr(cCRC,9,1),cSit),1)
for i := Len(cStr) to 1 step -1
nTot += Val(SubStr(cStr,i,1)) * nMul
nMul := if((++nMul) > 10, 3, nMul)
next
return if(nTot%11 < 2, "0", Str(11-(nTot%11),1)) == Right(cCRC,1)
end
return .F.