<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Извлечь Hex данные из файла]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=18325&amp;type=atom" />
	<updated>2024-11-12T23:23:35Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=18325</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Извлечь Hex данные из файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=161743#p161743" />
			<content type="html"><![CDATA[<p>Ещё удалось ускорить функцию сохранения &#039;Hex&#039; строки в файл (~46%):</p><div class="codebox"><pre><code>WriteHex2(Hex_Str, File := &quot;WriteHex2.txt&quot;){	;02:16 13.11.2024 Сохранить &#039;Hex&#039; строку бинарно в файл:
 DllCall(&quot;Crypt32\CryptStringToBinary&quot;, &quot;Ptr&quot;, &amp;Hex_Str, &quot;UInt&quot;, StrLen(Hex_Str), &quot;UInt&quot;, 0xC, &quot;UInt&quot;, 0, &quot;UIntP&quot;, bytes, &quot;UIntP&quot;, 0, &quot;UIntP&quot;, 0)
 VarSetCapacity(outData, bytes)
 DllCall(&quot;Crypt32\CryptStringToBinary&quot;, &quot;Ptr&quot;, &amp;Hex_Str, &quot;UInt&quot;, StrLen(Hex_Str), &quot;UInt&quot;, 0xC, Str, outData, &quot;UIntP&quot;, bytes, &quot;UIntP&quot;, 0, &quot;UIntP&quot;, 0)
 File := FileOpen(File, &quot;w&quot;), File.RawWrite(outData, bytes), File.Close()
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[__Михаил__]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=40928</uri>
			</author>
			<updated>2024-11-12T23:23:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=161743#p161743</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Извлечь Hex данные из файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=161742#p161742" />
			<content type="html"><![CDATA[<p>Потрясающая скорость! Я такого даже не ожидал.</p><div class="codebox"><pre><code>CPU Max:	Kub0 - In The Dark.mp3
GetHexData:	875мс.
OpenHex:	8140мс.
Разница: 	89.25%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[__Михаил__]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=40928</uri>
			</author>
			<updated>2024-11-11T20:17:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=161742#p161742</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Извлечь Hex данные из файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=161741#p161741" />
			<content type="html"><![CDATA[<p>Ещё такой вариант протестируйте:<br /></p><div class="codebox"><pre><code>#SingleInstance Force
#MaxMem, 4095
#NoEnv
SetBatchLines -1
SetWorkingDir %A_ScriptDir%

File := &quot;123.mp3&quot;			; Размер файла:	1.87 Мб.
;File := &quot;Kub0 - In The Dark.mp3&quot;	; Размер файла:	10.1 Мб.

;-------------------------
ToolTip, [Обработка], 0, 0

TTime(0)	; Начать отсчёт времени.
A1 := GetHexData(File)
T1 := TTime(1)	; Завершить отсчёт.

TTime(0)
A2 := OpenHex(File)
T2 := TTime(1)

AA := [&quot;Да&quot;, &quot;Нет&quot;][2 - (A1 = A2)]	; Проверка на совпадение &#039;Hex&#039; данных.
P := Procent(T1, T2, 2, 1)		; Разница в процентах.

/*
; Для проверки - сохранить в файл Hex данные:
ToolTip, [Сохранение 1], 0, 0
WriteHex(A1, &quot;Test A1.mp3&quot;)

ToolTip, [Сохранение 2], 0, 0
WriteHex(A2, &quot;Test A2.mp3&quot;)
*/
ToolTip
MsgBox, % File &quot;`n`nGetHexData:`t&quot; T1 &quot;мс.`nOpenHex:`t&quot; T2 &quot;мс.`n`nСовпало:`t&quot; AA &quot;`nРазница: `t&quot; P
Return


;============================================================================================================================================

GetHexData(SourseFile){
    static fmt := CRYPT_STRING_HEXRAW := 0xC
    File := FileOpen(SourseFile, &quot;r&quot;, &quot;cp0&quot;)
    size := File.RawRead(bin, File.Length)
    if !DllCall(&quot;Crypt32\CryptBinaryToString&quot;, &quot;Ptr&quot;, &amp;bin, &quot;UInt&quot;, size, &quot;UInt&quot;, fmt, &quot;Ptr&quot;, 0, &quot;UIntP&quot;, chars)
        throw &quot;CryptBinaryToString failed. LastError: &quot; . A_LastError
    VarSetCapacity(outData, chars &lt;&lt; !!A_IsUnicode)
    DllCall(&quot;Crypt32\CryptBinaryToString&quot;, &quot;Ptr&quot;, &amp;bin, &quot;UInt&quot;, size, &quot;UInt&quot;, fmt, &quot;Str&quot;, outData, &quot;UIntP&quot;, chars)
    return RTrim(outData, &quot;`r`n&quot;)
}


OpenHex(File){ ;23:17 10.11.2024	Ускоренная версия:
 File := FileOpen(File, &quot;r&quot;), File.Pos := 0, File.RawRead(Buf, Length := File.Length), File.Close(), F := A_FormatInteger
 SetFormat, IntegerFast, Hex
 Loop % Length
  R := SubStr(NumGet(Buf, A_Index - 1, &quot;UChar&quot;), 3), Hex .= (StrLen(R) &lt; 2 ? &quot;0&quot; R : R)
 SetFormat, IntegerFast, % F
 Return Hex
}

; 09:08 27.04.2022	Сохранить &#039;Hex&#039; в файл.
WriteHex(HexStr, Path = &quot;WriteHex.txt&quot;){
 File := FileOpen(Path, &quot;w&quot;)
 While(I := SubStr(HexStr, A_Index*2-1, 2)) != &quot;&quot;
  File.WriteUChar(&quot;0x&quot; I)
 File.Close()
}

;23:29 03.01.2022	Для быстрого определения прошедшего времени для команд. Без ограничений для отсчёта разниц.
;M: 0:Начать отсчёт, 1:Вернуть разницу. I - индекс в массиве таймингов.
TTime(M := 1, I := 1){
 Static C := {}
 Return (M ? A_TickCount-C[i] : C[i] := A_TickCount)	; Сокращённый вариант.
}

;01:15 11.11.2024 Доработка: автоматически сравнивает меньшее от большего. Compare - отвечает за сравнение разницы чисел.
Procent(n1, n2, R := 2, Compare = 0){
 P := (Min(n1, n2) / Max(n1, n2)) * 100
 If (Compare)
  P := 100 - P
 Return ARound(P, R) &quot;%&quot;
}

; Округление числа до R знаков после запятой +удаление лишних нулей и точки, если она осталась.
ARound(N, R := 2){ ; N:Число, R:Округление после запятой.
 Return RTrim(RTrim(Round(N, R), &quot;0&quot;), &quot;.&quot;)
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2024-11-11T00:23:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=161741#p161741</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Извлечь Hex данные из файла]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=161740#p161740" />
			<content type="html"><![CDATA[<p>Удалось немного ускорить процесс извлечения &#039;Hex&#039; из файла. Надеюсь всё верно написал (процентное соотношение скорости обработки функций например).</p><div class="codebox"><pre><code>#SingleInstance Force
#NoEnv
SetBatchLines -1
SetWorkingDir %A_ScriptDir%
Menu, Tray, Click, 1


File := &quot;123.mp3&quot;			; Размер файла:	1.87 Мб.
;File := &quot;Kub0 - In The Dark.mp3&quot;	; Размер файла:	10.1 Мб.

;-------------------------
ToolTip, [Обработка], 0, 0

TTime(0)	; Начать отсчёт времени.
A1 := GetHexData(File)
T1 := TTime(1)	; Завершить отсчёт.

TTime(0)
A2 := OpenHex(File)
T2 := TTime(1)

AA := [&quot;Да&quot;, &quot;Нет&quot;][2 - (A1 = A2)]	; Проверка на совпадение &#039;Hex&#039; данных.
P := Procent(T1, T2, 2, 1)		; Разница в процентах.

/*
; Для проверки - сохранить в файл Hex данные:
ToolTip, [Сохранение 1], 0, 0
WriteHex(A1, &quot;Test A1.mp3&quot;)

ToolTip, [Сохранение 2], 0, 0
WriteHex(A2, &quot;Test A2.mp3&quot;)
*/
ToolTip
MsgBox, % File &quot;`n`nGetHexData:`t&quot; T1 &quot;мс.`nOpenHex:`t&quot; T2 &quot;мс.`n`nСовпало:`t&quot; AA &quot;`nРазница: `t&quot; P
Return


;============================================================================================================================================
;[teadrinker] 02.08.2013	http://forum.script-coding.com/viewtopic.php?pid=74189#p74189
; Извлекает &#039;Hex&#039; строку из файла. HexDataFile - путь вывода в файл (если нужно), Del - делитель (если нужно).
GetHexData(SourseFile, HexDataFile = 0, Del = &quot;&quot;){
 BinaryStream := ComObjCreate(&quot;ADODB.Stream&quot;)
 BinaryStream.Type := 1 ; adTypeBinary
 BinaryStream.Open
 BinaryStream.LoadFromFile(SourseFile)
 BinaryArray := BinaryStream.Read
 BinaryStream.Close
 R := A_FormatInteger		; Сохр. формат представления.
 SetFormat, IntegerFast, H
 Loop % BinaryArray.MaxIndex() + 1
  Text .= (A_Index = 1 ? &quot;&quot; : Del) . SubStr(&quot;0&quot; . SubStr(BinaryArray[A_Index-1]+0, 3), -1)
 If (HexDataFile = 0){	; Если путь не указан - вернуть строку:
  SetFormat, IntegerFast, % R
  Return Text
 }
 File := FileOpen(HexDataFile, &quot;w&quot;)
 File.Write(Text)
 File.Close()
 SetFormat, IntegerFast, % R
}


OpenHex(File){ ;23:17 10.11.2024	Ускоренная версия:
 File := FileOpen(File, &quot;r&quot;), File.Pos := 0, File.RawRead(Buf, Length := File.Length), File.Close(), F := A_FormatInteger
 SetFormat, IntegerFast, Hex
 Loop % Length
  R := SubStr(NumGet(Buf, A_Index - 1, &quot;UChar&quot;), 3), Hex .= (StrLen(R) &lt; 2 ? &quot;0&quot; R : R)
 SetFormat, IntegerFast, % F
 Return Hex
}

; 09:08 27.04.2022	Сохранить &#039;Hex&#039; в файл.
WriteHex(HexStr, Path = &quot;WriteHex.txt&quot;){
 File := FileOpen(Path, &quot;w&quot;)
 While(I := SubStr(HexStr, A_Index*2-1, 2)) != &quot;&quot;
  File.WriteUChar(&quot;0x&quot; I)
 File.Close()
}

;23:29 03.01.2022	Для быстрого определения прошедшего времени для команд. Без ограничений для отсчёта разниц.
;M: 0:Начать отсчёт, 1:Вернуть разницу. I - индекс в массиве таймингов.
TTime(M := 1, I := 1){
 Static C := {}
 Return (M ? A_TickCount-C[i] : C[i] := A_TickCount)	; Сокращённый вариант.
}

;01:15 11.11.2024 Доработка: автоматически сравнивает меньшее от большего. Compare - отвечает за сравнение разницы чисел.
Procent(n1, n2, R := 2, Compare = 0){
 P := (Min(n1, n2) / Max(n1, n2)) * 100
 If (Compare)
  P := 100 - P
 Return ARound(P, R) &quot;%&quot;
}

; Округление числа до R знаков после запятой +удаление лишних нулей и точки, если она осталась.
ARound(N, R := 2){ ; N:Число, R:Округление после запятой.
 Return RTrim(RTrim(Round(N, R), &quot;0&quot;), &quot;.&quot;)
}
</code></pre></div><div class="codebox"><pre><code>Процессор:	AMD Ryzen 5 5600.
Тест при разных настройках в Электропитании помпа:
-------------------------	Файл: 123.mp3
-	CPU Eco:	-
GetHexData:	3829мс.
OpenHex:	2296мс.
Разница: 	40.04%

GetHexData:	3735мс.
OpenHex:	2312мс.
Разница: 	38.1%

GetHexData:	2047мс.
OpenHex:	1297мс.
Разница: 	36.64%
-------------------------
-	CPU Balance:	-
GetHexData:	2063мс.
OpenHex:	1281мс.
Разница: 	37.91%

GetHexData:	2031мс.
OpenHex:	1219мс.
Разница: 	39.98%

GetHexData:	2062мс.
OpenHex:	1235мс.
Разница: 	40.11%
-------------------------
-	CPU Max:	-
GetHexData:	1453мс.
OpenHex:	875мс.
Разница: 	39.78%

GetHexData:	1485мс.
OpenHex:	906мс.
Разница: 	38.99%

GetHexData:	1438мс.
OpenHex:	891мс.
Разница: 	38.04%
-------------------------
-------------------------
-------------------------	Файл: 	Kub0 - In The Dark.mp3
-	CPU Eco:	-
GetHexData:	27656мс.
OpenHex:	19766мс.
Разница: 	28.53%

GetHexData:	27969мс.
OpenHex:	20438мс.
Разница: 	26.93%

GetHexData:	28500мс.
OpenHex:	19469мс.
Разница: 	31.69%
-------------------------
-	CPU Balance:	-
GetHexData:	14938мс.
OpenHex:	10687мс.
Разница: 	28.46%

GetHexData:	14938мс.
OpenHex:	10562мс.
Разница: 	29.29%

GetHexData:	14938мс.
OpenHex:	10593мс.
Разница: 	29.09%
-------------------------
-	CPU Max:	-
GetHexData:	11016мс.
OpenHex:	7937мс.
Разница: 	27.95%

GetHexData:	10953мс.
OpenHex:	7907мс.
Разница: 	27.81%

GetHexData:	10953мс.
OpenHex:	7969мс.
Разница: 	27.24%

-------------------------
-	CPU Balance:	-
GetHexData:	15062мс.
OpenHex:	10625мс.
Разница: 	29.46%

GetHexData:	14969мс.
OpenHex:	10641мс.
Разница: 	28.91%

GetHexData:	15375мс.
OpenHex:	10578мс.
Разница: 	31.2%
-------------------------
-	CPU Eco:	-
GetHexData:	27687мс.
OpenHex:	19938мс.
Разница: 	27.99%

GetHexData:	28781мс.
OpenHex:	19797мс.
Разница: 	31.22%

GetHexData:	28219мс.
OpenHex:	20063мс.
Разница: 	28.9%

GetHexData:	27547мс.
OpenHex:	19187мс.
Разница: 	30.35%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[__Михаил__]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=40928</uri>
			</author>
			<updated>2024-11-10T22:49:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=161740#p161740</id>
		</entry>
</feed>
