<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; LangMF 11: CRC32 файла]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=16583&amp;type=atom" />
	<updated>2021-09-14T16:20:35Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=16583</id>
		<entry>
			<title type="html"><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149539#p149539" />
			<content type="html"><![CDATA[<p>Поправил у себя этот пример, работает с большими файлами если BUFFER_SIZE кратно 65536.</p><p>Спасибо за выявленный баг.</p>]]></content>
			<author>
				<name><![CDATA[atomix]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=18421</uri>
			</author>
			<updated>2021-09-14T16:20:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149539#p149539</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149525#p149525" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2021-09-13T17:42:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149525#p149525</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149524#p149524" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2021-09-13T17:19:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149524#p149524</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: LangMF 11: CRC32 файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149522#p149522" />
			<content type="html"><![CDATA[<p>Интересное использование. А сравнивал по быстродействию с оригинальным примером?</p>]]></content>
			<author>
				<name><![CDATA[atomix]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=18421</uri>
			</author>
			<updated>2021-09-13T16:37:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149522#p149522</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[LangMF 11: CRC32 файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=149519#p149519" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2021-09-13T15:29:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=149519#p149519</id>
		</entry>
</feed>
