1 (изменено: Alectric, 2014-07-23 17:15:22)

Тема: AHK: Функция вычисления CRC16

Приветствую всех.

Есть ли у кого-нибудь код на AHK для определения контрольной суммы CRC16 (если я конечно не ошибаюсь, нужен код из 4-х символов на выходе вроде: 6FBD) для файлов?

Искал в интернете, на http://www.autohotkey.com, и на нашем форуме - результат отрицательный.

Самое близкое из того что нашел:

FileCRC32( sFile="",cSz=4 ) { ; by SKAN www.autohotkey.com/community/viewtopic.php?t=64211
 cSz := (cSz<0||cSz>8) ? 2**22 : 2**(18+cSz), VarSetCapacity( Buffer,cSz,0 ) ; 10-Oct-2009
 hFil := DllCall( "CreateFile", Str,sFile,UInt,0x80000000, Int,3,Int,0,Int,3,Int,0,Int,0 )
 IfLess,hFil,1, Return,hFil
 hMod := DllCall( "LoadLibrary", Str,"ntdll.dll" ), CRC32 := 0
 DllCall( "GetFileSizeEx", UInt,hFil, UInt,&Buffer ),    fSz := NumGet( Buffer,0,"Int64" )
 Loop % ( fSz//cSz + !!Mod( fSz,cSz ) )
   DllCall( "ReadFile", UInt,hFil, UInt,&Buffer, UInt,cSz, UIntP,Bytes, UInt,0 )
 , CRC32 := DllCall( "NTDLL\RtlComputeCrc32", UInt,CRC32, UInt,&Buffer, UInt,Bytes, UInt )
 DllCall( "CloseHandle", UInt,hFil )
 SetFormat, Integer, % SubStr( ( A_FI := A_FormatInteger ) "H", 0 )
 CRC32 := SubStr( CRC32 + 0x1000000000, -7 ), DllCall( "CharUpper", Str,CRC32 )
 SetFormat, Integer, %A_FI%
Return CRC32, DllCall( "FreeLibrary", UInt,hMod )
}

Выдает сумму состоящую из 8-и символов.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

2

Re: AHK: Функция вычисления CRC16

А в чём проблема? (Кроме того, что код только под 32 бита)

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: Alectric, 2014-07-23 17:33:47)

Re: AHK: Функция вычисления CRC16

Вот файл для примера.
Контрольная сумма должна соответствовать его названию.

А по этому коду она состоит из 8-и символов.

Файл в архиве, а не сам архив.

Post's attachments

6FBD.zip 32.11 kb, 6 downloads since 2014-07-23 

You don't have the permssions to download the attachments of this post.
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

4

Re: AHK: Функция вычисления CRC16

Alectric пишет:

Контрольная сумма должна соответствовать его названию.

Я не особо в теме, но судя по описанию RtlComputeCrc32() выходное значение будет зависеть от начального параметра dwInitial, так что каким-то конкретным в данном случае оно не может быть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Alectric, 2014-07-23 18:40:34)

Re: AHK: Функция вычисления CRC16

Нашел такую информацию:

      Example input string: ABC
         CRC16              = 0x4521
         CRC16 (Modbus)     = 0x8550
         CRC16 (Sick)       = 0xC3C1
         CRC-CCITT (0x0000) = 0x3994
         CRC-CCITT (0xffff) = 0xF508
         CRC-CCITT (0x1d0f) = 0x2898
         CRC-CCITT (Kermit) = 0xE359
         CRC-DNP            = 0x5AD3
         CRC32              = 0xA3830348

Слишком много вариантов для 4-х символьной контрольной суммы.
Значит придется использовать другой путь для моей программы...

Спасибо за ответы.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

6

Re: AHK: Функция вычисления CRC16

Alectric пишет:

CRC32 = 0xA3830348

В приведённом коде как раз этот вариант. А Вам, видимо, нужен был CRC16.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Alectric, 2014-07-23 18:50:44)

Re: AHK: Функция вычисления CRC16

Я об этом и писал в 1-ом посте... Но нигде не нашел кода для него.

Еще вот что нашел: http://softboard.ru/topic/34899-%D0%BF% … %B8-crc32/

Но это мне не понять...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.