Что нового

Регулярное выражение в бинарных данных

MaxHex

Новичок
Сообщения
16
Репутация
0
Здравствуйте, помогите вытащить название из бинарного фаила с помощью регулярного выражения, есть фаил у которого присутствует название по адресу hex 71 (dec 113), на 1 байт назад всегда "00", окончание названия заканчивает "00 00 00 00", помогите вытащить это название с помощью регулярного выражения, ограничение по символам можно сделать 100 (для FileRead), но если можно из без ограничения то было бы хорошо =)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Как-то так
Код:
$f = FileOpen("name.bin", 16)
$data = FileRead($f)
FileClose($f)
$arr = StringRegExp($data, "00(.*?)00000000", 1, 0x70 * 2)
If Not @error Then ConsoleWrite($arr[0] & @CRLF)
 
Автор
M

MaxHex

Новичок
Сообщения
16
Репутация
0
В таком варианте возникла такая проблема: если идет последовательность такая "37 00 6D 61 78 00 00 00 00" то все работает как надо, а если "30 00 6D 61 78 00 00 00 00" то возвращается строка со смещением "06 D6 17 8" и это уже не преобразовать в текст
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
MaxHex
Ну, сместитесь ещё на два символа ;)
Код:
0x71 * 2
 
Автор
M

MaxHex

Новичок
Сообщения
16
Репутация
0
В таком случае тогда будет проблемма когда будет такая последовательность 37 00 0D
 
Автор
M

MaxHex

Новичок
Сообщения
16
Репутация
0
Я наверное запутался, но не работает(( я вырезал заголовок из фаила и прекрепил во вложение, если Вам не трудно посмотрите пожалуйста. Сам фаил в архиве и в нем начало строки по адресу Hex 65 (Dec 101). Код я использовал Ваш (немного исправив):
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
$f = FileOpen("C:\Users\1\Desktop\JNX Editor\Untitled1.jnx", 16)
$data = FileRead($f)
FileClose($f)
$arr = StringRegExp($data, "00(.*?)00000000", 1, 0x65 * 2)
$Text = _HexToString ( $arr[0] )
MsgBox (0,"", $arr[0])
MsgBox (0,"", $Text)
Смещение менял на 0х66 и на 0х64 - в обоих случаях на выходе не то
 

Вложения

  • Untitled1.zip
    331 байт · Просмотры: 1

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
MaxHex [?]
Смещение менял на 0х66 и на 0х64
+1 нужно добавить, т.к. StringRegExp отсчитывает смещение с единицы
Код:
$data = FileRead("Untitled1.jnx")
$arr = StringRegExp($data, "00(.*?)00000000", 1, 0x65 * 2 + 1)
If Not @error Then ConsoleWrite(BinaryToString("0x"& $arr[0]) & @CRLF)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
MaxHex [?]
название по адресу hex 71
В идеале регулярка не нужна, есть смещение, ставишь указатель на смещение, читаешь сколько-то символов, функцией поиска находишь 000000, если позиция нечётная, проверяешь ещё 0 в позиции со смещенем найденного +6, далее Mid.
Только не понятно, в вышеуказанных примерах читается не бинарный.
 
Автор
M

MaxHex

Новичок
Сообщения
16
Репутация
0
AZJIO сказал(а):
MaxHex [?]
название по адресу hex 71
В идеале регулярка не нужна, есть смещение, ставишь указатель на смещение, читаешь сколько-то символов, функцией поиска находишь 000000, если позиция нечётная, проверяешь ещё 0 в позиции со смещенем найденного +6, далее Mid.
Только не понятно, в вышеуказанных примерах читается не бинарный.
Так а как узнать сколько символов считывать? Названия могут быть любые и размер соответственно может отличаться
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
MaxHex сказал(а):
Так а как узнать сколько символов считывать? Названия могут быть любые и размер соответственно может отличаться
Начало известно, оно же смещение. Конец известен, он же найденный 00000000 (используй StringInStr), длина - разница между концом и началом, грубо говоря 85-71 = 14. Ищем строку Chr(0)&Chr(0)&Chr(0)

примерно так, не проверял
Код:
$hFile = FileOpen(@ScriptDir & '\file.txt', 0)
FileSetPos($hFile, 113, 0)
$sText = FileRead($hFile, 100) ; предположим что название не может быть слишком длинным
FileClose($hFile)

$iPos = StringInStr($sText,  Chr(0)&Chr(0)&Chr(0))
If $iPos Then
	$sText = StringMid($sText, 1, $iPos - 1)
EndIf
MsgBox(0, 'Сообщение', $sText)
 
Автор
M

MaxHex

Новичок
Сообщения
16
Репутация
0
AZJIO сказал(а):
Начало известно, оно же смещение. Конец известен, он же найденный 00000000 (используй StringInStr), длина - разница между концом и началом, грубо говоря 85-71 = 14. Ищем строку Chr(0)&Chr(0)&Chr(0)

примерно так, не проверял
Код:
$hFile = FileOpen(@ScriptDir & '\file.txt', 0)
FileSetPos($hFile, 113, 0)
$sText = FileRead($hFile, 100) ; предположим что название не может быть слишком длинным
FileClose($hFile)

$iPos = StringInStr($sText,  Chr(0)&Chr(0)&Chr(0))
If $iPos Then
	$sText = StringMid($sText, 1, $iPos - 1)
EndIf
MsgBox(0, 'Сообщение', $sText)
Вот такой ответ вышел и я так понимаю на выходе должно было получиться название а не цифры?
 

Вложения

  • Windows.png
    Windows.png
    17.2 КБ · Просмотры: 5
Верх