<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; LangMF 11: CRC32 файла]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=16583</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=16583&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «LangMF 11: CRC32 файла».]]></description>
		<lastBuildDate>Tue, 14 Sep 2021 16:20:35 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149539#p149539</link>
			<description><![CDATA[<p>Поправил у себя этот пример, работает с большими файлами если BUFFER_SIZE кратно 65536.</p><p>Спасибо за выявленный баг.</p>]]></description>
			<author><![CDATA[null@example.com (atomix)]]></author>
			<pubDate>Tue, 14 Sep 2021 16:20:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149539#p149539</guid>
		</item>
		<item>
			<title><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149525#p149525</link>
			<description><![CDATA[<p>Кажется есть вариант, если в коде оригинального примера изменить значение </p><div class="codebox"><pre><code>
Const BUFFER_SIZE = 8000000
</code></pre></div><p>например на<br /></p><div class="codebox"><pre><code>
Const BUFFER_SIZE = 65536
</code></pre></div><p>т.е:</p><div class="codebox"><pre><code>
Private Declare Function RtlComputeCrc32 Lib &quot;ntdll.dll&quot; (ByVal dwInitial As Long, ByVal pData As Long, ByVal iLen As Long) As Long
&lt;#Module=mdlMain&gt;
&#039;---------------------------------------
Sub Load(cmdLine)
 
	nameFile = &quot;C:\Users\Public\Documents\OOo_2.0.1_windows_install_ru.zip&quot;
	MsgBox CRC32(nameFile),vbSystemModal
	EndMF
End Sub

&#039;---------------------------------------
Function CRC32(nFile)
    Dim fs, pos, sz, ptr
    
    Const OPEN_EXISTING  = 3
    Const GENERIC_READ   = &amp;H80000000
    &#039;/Const BUFFER_SIZE    = 8000000
    Const BUFFER_SIZE    = 65536
    
    CRC32 = 0
    
    Set f = sys.file.api
    If f.FOpen(nFile, OPEN_EXISTING, GENERIC_READ) = -1 Then Exit Function
    
    pos = 0  :  fs = f.LOF  :  sz = BUFFER_SIZE
    
    Do
        If fs - pos = 0 Then Exit Do
        If fs - pos &lt; BUFFER_SIZE Then sz = fs - Pos
        
        f.UnMap
        ptr = f.Map(,,pos,sz)
        If ptr = 0 Then Exit Do
  
        CRC32 = RtlComputeCrc32(CRC32, ptr, sz)
        
        pos = pos + sz
    Loop Until pos &gt;= fs
    
    f.FClose
    
    CRC32 = Hex(CRC32)
End Function
&lt;#Module&gt;
</code></pre></div><p>то результат CRC32 для большого файла соответствует 7zip - 4B5EA7E9. Видимо скрипт из первого поста оказался не нужным.</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 13 Sep 2021 17:42:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149525#p149525</guid>
		</item>
		<item>
			<title><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149524#p149524</link>
			<description><![CDATA[<p>Нет, быстродействие не сравнивал. Использовал сокращенный код LagMF 11 из оригинального примера Examples\FileHash:<br /></p><div class="codebox"><pre><code>
Private Declare Function RtlComputeCrc32 Lib &quot;ntdll.dll&quot; (ByVal dwInitial As Long, ByVal pData As Long, ByVal iLen As Long) As Long
&lt;#Module=mdlMain&gt;
&#039;---------------------------------------
Sub Load(cmdLine)
 
	nameFile = &quot;C:\Users\Public\Documents\OOo_2.0.1_windows_install_ru.zip&quot;
	MsgBox CRC32(nameFile),vbSystemModal
	EndMF
End Sub

&#039;---------------------------------------
Function CRC32(nFile)
    Dim fs, pos, sz, ptr
    
    Const OPEN_EXISTING  = 3
    Const GENERIC_READ   = &amp;H80000000
    Const BUFFER_SIZE    = 8000000
    
    CRC32 = 0
    
    Set f = sys.file.api
    If f.FOpen(nFile, OPEN_EXISTING, GENERIC_READ) = -1 Then Exit Function
    
    pos = 0  :  fs = f.LOF  :  sz = BUFFER_SIZE
    
    Do
        If fs - pos = 0 Then Exit Do
        If fs - pos &lt; BUFFER_SIZE Then sz = fs - Pos
        
        f.UnMap
        ptr = f.Map(,,pos,sz)
        If ptr = 0 Then Exit Do
  
        CRC32 = RtlComputeCrc32(CRC32, ptr, sz)
        
        pos = pos + sz
    Loop Until pos &gt;= fs
    
    f.FClose
    
    CRC32 = Hex(CRC32)
End Function
&lt;#Module&gt;
</code></pre></div><p>Результат для файла OOo_2.0.1_windows_install_ru.zip(78,9 МБ): 160CDEDF. Результат 7zip для того же файла: 4B5EA7E9. Собственно на 7zip и равнялся.</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 13 Sep 2021 17:19:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149524#p149524</guid>
		</item>
		<item>
			<title><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149522#p149522</link>
			<description><![CDATA[<p>Интересное использование. А сравнивал по быстродействию с оригинальным примером?</p>]]></description>
			<author><![CDATA[null@example.com (atomix)]]></author>
			<pubDate>Mon, 13 Sep 2021 16:37:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149522#p149522</guid>
		</item>
		<item>
			<title><![CDATA[LangMF 11: CRC32 файла]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149519#p149519</link>
			<description><![CDATA[<p>В LangMF 11, так понял, отсутствует функция получения crc32 файла, а используется скрипт с применением RtlComputeCrc32 (ntdll.dll). Как вариант (тестировалось на Win 7):</p><div class="codebox"><pre><code>

&#039; Поиск CRC32 файла
&#039; Потребуется установленный LangMF 11
&#039; OC Win 7

Private Declare Function RtlComputeCrc32 Lib &quot;ntdll.dll&quot; (ByVal dwInitial As Long, ByVal pData As Long, ByVal iLen As Long) As Long
&lt;#Module=crc32&gt;

&#039;-----------------------------------------------------------------------
Sub Load(cmdstr)

	&#039;Архив размером 78,9 МБ. CRC32 совпадает с результатом 7zip
	sFilePath = &quot;C:\Users\Public\Documents\OOo_2.0.1_windows_install_ru.zip&quot;

	MsgBox &quot;File CRC32: 0x&quot; &amp; Hex(GetCRC32(sFilePath)), vbSystemModal + vbExclamation, &quot;Reply&quot;
	EndMF

End Sub

&#039;/Получить CRC32 файла/
&#039;-----------------------------------------------------------------------
Function GetCRC32(sFile)

	Dim buf()
	Dim buf1
	Dim crc32
	Dim lSize, chunk, div, SZ
	Dim u
	Dim ptr

	Const OPEN_EXISTING = 3
	Const GENERIC_READ = &amp;H80000000

	&#039;/Чем больше размер BUF_SIZE тем быстрее работает скрипт за счет сокращения обращений к RtlComputeCrc32/
	Const BUF_SIZE = 65536

	Set f = sys.file.api
	If f.FOpen(sFile, OPEN_EXISTING, GENERIC_READ)=-1 Then GetCRC32=-1 : Exit Function
	
	lSize = f.LOF
	chunk = lSize Mod BUF_SIZE
	div = (lSize - chunk)/BUF_SIZE

	&#039;/Получение контрольной суммы фрагментами/
	&#039;---------------------------------------------------------------
	crc32 = 0

	&#039; Для фрагментов равных размеру буфера
	&#039;---------------------------------------------------------------
	SZ = BUF_SIZE
	ReDim buf(SZ-1)
	buf1 = Sys.SHD.ArrayByte(buf)
	ptr = Sys.SHD.ArrayPtr(buf1)

	For u=0 To div-1
		f.FGet buf1
		crc32 = RtlComputeCrc32(crc32, ptr, SZ)
	Next
			
	&#039; Для остаточного фрагмента (вынесено из цикла)
	&#039;---------------------------------------------------------------
	SZ = chunk
	ReDim buf(SZ-1)
	f.FGet buf1
	crc32 = RtlComputeCrc32(crc32, ptr, SZ)

	&#039;---------------------------------------------------------------
	f.FClose
	GetCRC32 = crc32

End Function
&lt;#Module&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Mon, 13 Sep 2021 15:29:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149519#p149519</guid>
		</item>
	</channel>
</rss>
