Сумма = 0
Цикл
Берешь ASCII номер символа в файле
прибавляешь к Сумме
если Сумма = Трехзначное - значит отрезаем два последних символа
Конец цикла
Конец
Это профанация, а не контрольная сумма. Диапазон значений - всего 100, уже среди 101го исходного значения будет как минимум 1 совпадение этих "контрольных сумм". Реально - десяток. Да и подделывается как два пальца об асфальт. А во времена DOS'а уже были вирусы, умеющие подделывать СRС32 зараженных файлов, а диапазон CRC32 - 32 бита, т.е. long целиком, от минуса до плюса.если Сумма = Трехзначное - значит отрезаем два последних символа
Option Explicit
'This module calculates the CRC32-checksum of a certain bytestream
Dim CrcTableInit As Boolean
Dim CRCTable(0 To 255) As Long
Public Function CalcCRC32(ByteArray() As Byte) As Long
Dim I As Long
Dim crc As Long
If CrcTableInit = False Then Call Init_CRCTable
crc = -1
For I = 0 To UBound(ByteArray) - 1
crc = (((crc And &HFFFFFF00) \ &H100) And &HFFFFFF) Xor (CRCTable((crc And &HFF) Xor ByteArray(I)))
Next I
crc = crc Xor &HFFFFFFFF
CalcCRC32 = crc
End Function
Private Sub Init_CRCTable()
Const Limit = &HEDB88320
Dim I As Long
Dim j As Long
Dim crc As Long
For I = 0 To 255
crc = I
For j = 0 To 7
If crc And 1 Then
crc = (((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF) Xor Limit
Else
crc = ((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF
End If
Next j
CRCTable(I) = crc
Next I
CrcTableInit = True
End Sub
Private crc32Table() As Long
...
Function CalcCRC(Data As String) As Long
Dim crc32Result As Long, I As Long, L As Byte, B As Byte
Const dwPolynomial As Long = &HEDB88320
On Error GoTo ErrorHandler
I = crc32Table(0)
On Error GoTo 0
crc32Result = &HFFFFFFFF
For I = 1 To Len(Data)
B = Asc(Mid$(Data, I, 1))
L = (crc32Result And &HFF) Xor B
crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And 16777215 ' nasty shr 8 with vb :/
crc32Result = crc32Result Xor crc32Table(L)
Next I
CalcCRC = Not crc32Result
Exit Function
ErrorHandler:
'If Err.Number <> 9 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
ReDim crc32Table(0 To 255)
For I = 0 To 255
crc32Result = I
For B = 0 To 7
If (crc32Result And 1) Then
crc32Result = ((crc32Result And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
crc32Result = crc32Result Xor dwPolynomial
Else
crc32Result = ((crc32Result And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
End If
Next B
crc32Table(I) = crc32Result
Next I
Resume
End Function
SKYS писал(а):Открываю файл удаляю одну букву сново её ввожу в то же место. Все файл не принимается хотя содержимое то же
MyProgramm.exe=BEDBD536;1.9.192;1014272;2008-1-9 14:42:33;0
Andrey Fedorov писал(а):Алгоритм расчета CRC32, нестандартный, так что подобрать его довольно тяжко - в лоб явно не получится, так что я бы не взялся...
kibernetics писал(а):Andrey Fedorov
так что, получается, что CRC у тебя может быть разная с одним и тем же содержимым файла, байт в байт?
kibernetics писал(а):ибо, очень неприятно, когда потом тебе станут говорить, мол ваша программа - распространитель вирусов.
а защиту, я считаю, что "кому это нужно" тот сможет сломать.
kibernetics писал(а):SKYS
чтобы выяснить неизвестную методику црц-подсчётов, нужно иметь как минимум более одного файла. Берёшь два файла, желательно с различным только одним символом, и сравниваешь. Потом изменяешь еще отличный на другой символ и опять сравниваешь. И так, чтобы сформировать картину изменений. На основании этих замеров, у тебя в итоге должна сложится картина, что и насколько пересчитывается.
Но, в твоей ситуации, чтото не до конца ясное, потому что,SKYS писал(а):Открываю файл удаляю одну букву сново её ввожу в то же место. Все файл не принимается хотя содержимое то же
Либо ты вставляешь не тот символ, либо в CRC замешано чтото с привязкой к дате изменения файла. Либо, на самом деле, изменяется размер после твоего "дописывания/переписывания".
Сделай проще, возьми файл до изменения, получи его CRC. Удали букву, вставь опять, и опять получи CRC. Если суммы неравны, значит косяк у тебя.
и(для определения crc использовал код который предоставил Antonariy)
, то файл сформировывается не идентичный первому. CRC не врет и не зависит от даты создания файла.тутже спустя минут 15 сново формирую файл ничего не изменяя и получаю следующую crc сумму = 750429289
Сейчас этот форум просматривают: Google-бот и гости: 60