ynbIpb
Скриптер
- Сообщения
- 399
- Репутация
- 110
Вобщем задача такая:
Есть файл специфического формата (игровой), в нём зашиты строки в формате UTF-8, но кроме символов юникода там присутствуют коды значков в игре, которые отображаются в виде картинки и мне при чтении такой строки нужно оставить этот код в HEX виде.
Например:
исходная строка: 0xEF808153656C6563742043616E7661732050616E656C
UTF-8: Select Canvas Panel
А нужно так: {EF}{80}{81} Select Canvas Panel
Изначально я выискивал их по чёрному списку:
filter.ini такой:
Но тут возникла проблема: Фильтровать приходилось и символ переноса строки 0x0D0A, но метод StringReplace выхватывал кусок из соседнего байта и строка билась. Например:
исходная строка: 0x D0 93 D0 B0 D0 B9 20 D0 A4 D0 BE D0 BA D1 81
UTF-8: Гай Фокс
Помогите составить регексп выражаение, которое бы заменяло эти символы с учётом того что 1 байт 2 символа и не тырило по 1 символу с чужих байт.
Есть файл специфического формата (игровой), в нём зашиты строки в формате UTF-8, но кроме символов юникода там присутствуют коды значков в игре, которые отображаются в виде картинки и мне при чтении такой строки нужно оставить этот код в HEX виде.
Например:
исходная строка: 0xEF808153656C6563742043616E7661732050616E656C
UTF-8: Select Canvas Panel
А нужно так: {EF}{80}{81} Select Canvas Panel
Изначально я выискивал их по чёрному списку:
Код:
; функция фильтрации строк
Func _FilterBinString($b_TxtStr)
If FileExists ($sFilter_ini) = 0 Then Return $b_TxtStr ; если файл filter.ini не существует, то возвращаем из функции исходную строку
$aFilter_ini = IniReadSection ($sFilter_ini, "filter") ; загружаем filter.ini в массив
$sHEXstr = Hex ($b_TxtStr) ; переобразуем бинарные данные в HEX (отрезаем 0x)
If $sHEXstr = "09" Then Return Binary ("0x7B30397D") ; если строка состоит только из одного символа "TAB", то возвращаем его HEX код в скобках
If $sHEXstr = "20" Then Return Binary ("0x7B32307D") ; если строка состоит только из одного символа "Пробел", то возвращаем его HEX код в скобках
For $i=1 To $aFilter_ini[0][0] ; крутим цикл столько раз сколько элементов в секции ini файла
If StringInStr ($sHEXstr, $aFilter_ini[$i][0]) Then ; если образец присутствует, то
$sHEXstr = StringReplace ($sHEXstr, $aFilter_ini[$i][0], $aFilter_ini[$i][1]) ; заменяем фрагменты текста
EndIf
Next
Return Binary ("0x" & $sHEXstr) ; возвращаем изменённый текст
EndFunc
filter.ini такой:
Код:
[filter]
EF8081=7B45467D7B38307D7B38317D
EF8082=7B45467D7B38307D7B38327D
EF8084=7B45467D7B38307D7B38347D
EF8085=7B45467D7B38307D7B38357D
и т.д.
исходная строка: 0x D0 93 D0 B0 D0 B9 20 D0 A4 D0 BE D0 BA D1 81
UTF-8: Гай Фокс
Помогите составить регексп выражаение, которое бы заменяло эти символы с учётом того что 1 байт 2 символа и не тырило по 1 символу с чужих байт.