<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoHotkey: FileRead для бинарных файлов]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=432</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=432&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoHotkey: FileRead для бинарных файлов».]]></description>
		<lastBuildDate>Thu, 26 Apr 2007 12:21:20 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AutoHotkey: FileRead для бинарных файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=2640#p2640</link>
			<description><![CDATA[<p>Понадобилось мне скриптом анализировать конфиги одной проги. А они, гадство, оказались в бинарном виде. Т.е. и текст там есть, но есть и двоичные нули (00). А команда FileRead обламывается на файлах, имеющих в содержимом двоичные нули. Об этом в AHK-справке честно сказано. Сказано и то, что содержимое прочитанного файла всё же может быть вытащено,&nbsp; но некими продвинутыми методами. Примеры &quot;продвинутых методов&quot; отсутствуют.<br />Полез я на буржуйский форум и, как это часто бывает, оказалось, что для чтения и даже записи бинарных файлов уже <a href="http://www.autohotkey.com/forum/viewtopic.php?t=7549">написаны функции</a>. Функции мощные (обычно, я люблю такие), но для моего случая они были явно избыточны. Тем более, что эти функции разнесены по 3м-4м разным файлам, объединяющимся через <strong>#Include</strong>. Стал я в них вникать, с целью укоротить. Вникал три дня и три ночи (пока вникалку не отобрали). И тут меня осенило (хотя, наверное, лучше сказать &quot;овеснило&quot;). Будь я посообразительней, могло бы овеснить и раньше. Однако, к делу.<br /><strong>Предлагаемый скрипт показывает, как можно получить целиком содержимое любого файла (не обязательно бинарного) в hex-виде</strong>. Дальше по нему уже можно пройтись RegExp&#039;ами, или вынуть текстовые данные (скрипт <strong>Rajat</strong>&#039;а для этого можно найти <a href="http://www.autohotkey.com/forum/viewtopic.php?t=4419">здесь</a>), или обработать любым другим желаемым способом.</p><div class="codebox"><pre><code>;*******************************************************************************
; AutoHotkey Version:    1.0.46.09+
; Автор:                Androgen Belkin
; Имя скрипта:            File2Hex.ahk (v.1.0)
;*******************************************************************************
; Скрипт получает содержимое указанного файла в hex-виде.
;*******************************************************************************
SetBatchLines, -1    ; максимальная скорость для скрипта
#NoEnv            ; запрещаем имена переменных как у переменных окружения

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
FileName = c:\boot.ini
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========
IfNotExist, %FileName%
{
   MsgBox, Не существует файл`n&quot;%FileName%&quot;
   ExitApp ; конец скрипта
}
FileGetSize, FileSize, %FileName%
FileRead, Contents, %Filename% ; читаем содержимое файла
If ErrorLevel ; файл заблокирован, например
{
    MsgBox, Не удалось прочитать файл`n&quot;%FileName%&quot;`nErrorLevel: %ErrorLevel%
    ExitApp ; конец скрипта
}
VarSetCapacity( hexString, FileSize * 2 ) ; запрашиваем память под hex-данные
; запрашивать память здесь не обязательно, но так будет работать немного быстрее
ContAddress := &amp;Contents ; получаем адрес данных в памяти
SetFormat, Integer, Hex
Loop, %FileSize% ; будем читать все байты содержимого файла в памяти (файл целиком)
{
    ; если написать hex := *ContAddress, то в полученном hex-числе будет отсутствовать лидирующий ноль
    ; чтобы обойти это, мы сейчас прибавим число, а в следующей строке избавимся от прибавленного
    hex := *ContAddress + 0x100 ; делаем так, чтобы hex-число было, например, не 0xF, а 0x10F
    StringRight hex, hex, 2 ; берём из числа последние 2 цифры (это и есть нужный нам hex)
    StringUpper hex, hex ; переводим число в верхний регистр (для красоты)
    hexString := hexString . hex ; плюсуем к общей hex-строке
    ContAddress++ ; переходим к следующему байту
}
MsgBox, hexString:`n%hexString% ; смотрим результат</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Androgen)]]></author>
			<pubDate>Thu, 26 Apr 2007 12:21:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=2640#p2640</guid>
		</item>
	</channel>
</rss>
