Что нового

Извлечение исходных данных + перенос в бинарные данные

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, у меня проблема с переносом бинарных данных. К примеру у меня есть файл *.exe , как можно его прочитать предположим командой
Код:
Fileread($file)
а потом записать теже данные в файл в представлении бинарных данных например:
Код:
Binary(666); => 0x9A020000

у меня есть пример которым я старался пользоватся но AutoIt просто обратно копирует прочитанные данные из екзешника в файл.
Код:
$file = FileRead('Prog.exe')
$bin = Binary($file)
FileWrite('bin.txt', $bin)

Пробовал через окна с элементами Edit но получается долго, приходится по 10-15 мин. ждать чтобы 1-3 мб файл был прочитан.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MnM,
Код:
$hFile = FileOpen(@AutoItExe, 16)
$bRead = FileRead($hFile)
FileClose($hFile)
$hFile = FileOpen(@ScriptDir & '\bin.txt', 18)
FileWrite($hFile, $bRead)
FileClose($hFile)
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Код:
$hFile = FileOpen(@AutoItExe, 16)
$bRead = FileRead($hFile)
FileClose($hFile)
$hFile = FileOpen(@ScriptDir & '\bin.txt', 18)
FileWrite($hFile, $bRead)
FileClose($hFile)
madmasles извените ваш вариант работает ровно также как и мой :(
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Объясните подробно, что Вы хотите получить.
Я бы хотел получить бинарное представление прочтённого файла. Чтобы в текстовый файлик вписывались значения типа 0x0015... а не тот же вид что открыть например exe файл блокнотом и увидеть не понятно что :scratch:
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
MnM
Предлагаю написать пример чтобы можно было понять что конкретно вы хотите, вроде этого: Есть файл размером 10 байт 1111111111, хочу чтобы начиная с 5 байта последующие 3 байта изменились на значение 000 и получился результат 1111100011.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MnM [?]
Чтобы в текстовый файлик вписывались значения типа 0x0015...
Код:
$hFile = FileOpen(@AutoItExe, 16)
$bRead = FileRead($hFile)
FileClose($hFile)
$hFile = FileOpen(@ScriptDir & '\bin.txt', 2)
FileWrite($hFile, String($bRead))
FileClose($hFile)



Добавлено:
Сообщение автоматически объединено:

Или так.
Код:
Global $sFileFrom = @AutoItExe, $sFileTo = @ScriptDir & '\bin.txt', $iSize, $hFile, $bRead, $sText, $iStep = 16

$iSize = FileGetSize($sFileFrom)
$hFile = FileOpen($sFileFrom, 16)
For $i = 0 To $iSize Step $iStep
	$bRead = FileRead($hFile, $iStep)
	$sText &= StringFormat('0x%s | %-' & $iStep * 3 & 's| %s\r\n', Hex($i, 6), _
			StringRegExpReplace(Hex($bRead), '(?<=.{2})(?=(.{2})+\z)', ' '), _
			StringRegExpReplace(BinaryToString($bRead), '[\x00-\x1F]', '.'))
Next
FileClose($hFile)
$hFile = FileOpen($sFileTo, 2)
FileWrite($hFile, $sText)
FileClose($hFile)
 

erlik

Продвинутый
Сообщения
317
Репутация
84
madmasles
Отлично :ok:
Оказывается создать в Autoit Hex Viewer не так сложно как я думал.
...Хотя с другой стороны на подобный код у меня ушло бы кучу времени.
ЗЫ: Скрипт нужно однозначно в полезняшки закинуть.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Ускорил скрипт с 9 до 2.7 сек

Код:
Local $sFileFrom = @AutoItExe
Local $sFileTo = @ScriptDir & '\bin.txt'
Local $iStep = 16
Local $iCountStr, $hFile, $bRead, $sText

$timer = TimerInit()

$iCountStr = Ceiling(FileGetSize($sFileFrom) / $iStep) ; определяет количество строк
$hFile = FileOpen($sFileFrom, 16) ; открывает в бинарном виде
$bRead = FileRead($hFile) ; читает файл в бинарном виде
FileClose($hFile)
$sRead = BinaryToString($bRead) ; копирует аналог данных в строковом виде
$bRead = StringRegExpReplace(Hex($bRead), '.{2}', ' $0') ; добавляет разделитель в бинарные данные
; $bRead = StringRegExpReplace(StringTrimLeft($bRead, 2), '.{2}', ' $0') ; как вариант предыдущей строки
$abRead = StringRegExp($bRead, '.{1,48}', 3) ; создаёт массив по строкам 48 символов 16*3 (2 символа в бинарном виде + пробел)
$sRead = StringRegExpReplace($sRead, '[\x00-\x1F]', '.') ; заменяет управляющие символы (нечитаемые) точками
$asRead = StringRegExp($sRead, '.{1,16}', 3) ; создаёт массив по строкам 16 символов
For $i = 0 To $iCountStr - 1
	$sText &= '0x' & Hex($i * $iStep, 6) & ' |' & $abRead[$i] & ' |' & $asRead[$i] & @CRLF ; последнюю строку можно через StringFormat пропустить
Next

$hFile = FileOpen($sFileTo, 2)
FileWrite($hFile, $sText)
FileClose($hFile)

MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 2) & ' сек')


madmasles
Счёт в левой колонке неправильный.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Спасибо, почти то что нужно( преимущественно была нужна самая левая колонка :smile:)
 
Верх