Тема: AHK: RegHex Converter - ввод данных с двумя цифрами и запятой
Добрый день всем!
Написал скрипт, который работает в качестве конвертера hex данных реестра REG_EXPAND_SZ или REG_MULTI_SZ в текст и обратно.
Данные hex или text можно вводить как методом Copy-Paste, так и непосредственным набором с клавиатуры.
Конвертация данных происходит в Real Time в процессе набора или вставки данных.
Но возникла небольшая проблемка - если вводить текст, который начинается с двух первых цифр и запятой, то конвертация прекращается.
т.е., для примера:
38 попугаев - нормально конвертируется в hex
Результат конвертации:
33,00,38,00,20,00,3f,04,3e,04,3f,04,43,04,33,04,30,04,35,04,32,04,00,00
38, попугаев - проблема с конвертацией
Проблема скорее всего в этом шаблоне:
If RegExMatch(Source, "^\h*(\d\d,|\d\w,)+")
Но может и в другом шаблоне.
Я пока еще не совсем разобрался в составлении шаблонов RegEx.
Хотя, конечно, такое сочетание текста (две цифры и запятая) маловероятно встретить в реестре, но все же "а если вдруг" ...
Хотелось бы, чтобы все работало.
Есть ли у кого какие предложения и желание помочь?
Буду признателен за любую помощь.
Код скрипта конвертера:
#NoEnv
#NoTrayIcon
#SingleInstance force
SendMode Input
SetBatchLines -1
ProgName := "RegHex Converter"
Info =
(
1. Для конвертации в текст, вставить hex данные из *.reg файла.
2. Для конвертации в hex формата REG_EXPAND_SZ или REG_MULTI_SZ, вставить текст.`n
Примечания:
Для конвертации многострочного текста в формат REG_MULTI_SZ, данные для новой строки вводятся нажатием клавиши [Enter]
Конвертация происходит в реальном времени после вставки данных [Ctrl] + [V] или в процессе набора текста или hex данных.
)
GuiClr := "000000" ; цвет Gui
GuiW := 800 ; параметр для изменения (при изменении данного параметра изменяются все прочие параметры gui)
GuiH := GuiW/1.5
GuiTrans := 220 ; параметр для изменения - от 0 (невидимо) до 255 (без прозрачности)
FntStile := "Bold"
FntName := "Comic Sans MS" ; название шрифта
HeadSz := GuiW/46
FntClrHead := "00FFFF"
FntSzHead := HeadSz
TxtPosHead := "x0 y" GuiW/60 " Center"
TxtSzHead := "w" GuiW-(HeadSz*2) " h" HeadSz*2
FntClrClose := "FF0000"
FntSzClose := HeadSz
TxtPosClose := "x" GuiW-(HeadSz*2) " yp0 Center"
TxtSzClose := "w" HeadSz " h" HeadSz*2
FntClrAct := "FFFF00"
FntSzAct := GuiW/60
TxtPosAct := "x0 w" GuiW " Center"
TxtSzAct := ""
FntClrData := "000000"
FntSzData := 9 ; параметр для изменения
DataPos := "x" HeadSz
DataSz := "w" GuiW-(HeadSz*2) " h" GuiH/2.9
Gui -Caption +ToolWindow ;+AlwaysOnTop
Gui Color, % "c" GuiClr
Gui Font, % "c" FntClrHead " s" FntSzHead " " FntStile, % FntName
Gui Add, Text, % TxtPosHead " " TxtSzHead " gMoveGUI", % ProgName ; первая строка
Gui Font, % "c" FntClrClose " s" FntSzClose " " FntStile, % FntName
Gui Add, Text, % TxtPosClose " " TxtSzClose " vCloseProg gCloseProg", X
Gui Font, % "c" FntClrAct " s" FntSzAct " " FntStile, % FntName
Gui Add, Text, % TxtPosAct " " TxtSzAct " vReset gReset", Очистить все данные
Gui Font, % "c" FntClrData " s" FntSzData " " FntStile
Gui Add, Edit, % DataPos " " DataSz " vSource gConvert", % Info
Gui Font, % "c" FntClrAct " s" FntSzAct " " FntStile, % FntName
Gui, Add, Text, % TxtPosAct " " TxtSzAct " vCopy gCopy", Копировать данные в буфер
Gui Font, % "c" FntClrData " s" FntSzData " " FntStile
Gui Add, Edit, % DataPos " " DataSz " vResult"
Gui Show, % "w" GuiW " h" GuiH "Center", % ProgName
WinSet Region, % "w" GuiW " h" GuiH " R" GuiW/24 "-" GuiW/24 " 0-0", % ProgName
WinSet Transparent, % GuiTrans, % ProgName
Return
Convert:
GuiControlGet, Source
If RegExMatch(Source, "^\h*(\d\d,|\d\w,)+"){
GetTxt()
}
Else {
GetHex()
}
Return
Reset:
TxtClr("Reset",FntClrAct,FntSzAct)
GuiControl,, Source
GuiControl,, Result
Return
Copy:
TxtClr("Copy",FntClrAct,FntSzAct)
Gui Submit, NoHide
Clipboard := Result
return
MoveGUI(){
PostMessage, 0xA1, 0x2,,, A
}
CloseProg:
TxtClr("CloseProg",FntClrClose,FntSzClose)
Loop 100 {
TransFade := GuiTrans - A_Index
WinSet Transparent, % TransFade, % ProgName
Sleep 1
}
Gui Destroy
ExitApp
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; Translate functions
GetTxt(){
GuiControlGet, Source
Source := RegExReplace(Source, ",00,00,00,00,00$", ",00") ; удалить заключительный блок ,00,00,00,00 из REG_MULTI_SZ, чтобы не замещался на `n
Source := RegExReplace(Source, ",00,00,00$", ",00") ; удалить заключительный блок ,00,00,00 из REG_EXPAND_SZ за ненадобностью
Source := RegExReplace(Source, ",00,00,00,", ",00,0a,00,") ; предыдущий ,00, + символ перевода новой строки 00,00, (встречается только между строк) заменить на реальный \n = 0a,00
Source := RegExReplace(Source, "i)[^\da-f]") ; удалить запятые, пробелы и \
Loop % StrLen(Source) /2 {
Txt .= Chr("0x" SubStr(Source, A_index *4 -1, 2) SubStr(Source, A_index *4 -3, 2))
}
GuiControl,, Result, % Txt
}
GetHex(){
GuiControlGet, Source
VarSetCapacity(Hex, Len*(A_IsUnicode ? 2:1))
Len := StrPutVar(Source, V, "UTF-16")
Pointer := &V
Form := A_FormatInteger
SetFormat IntegerFast, H
Loop % Len*2 {
Hex .= (SubStr(0x100 + NumGet(Pointer + A_Index-1, 0, "Uchar"), -1) ",")
}
SetFormat IntegerFast, % Form
Hex := SubStr(Hex, 1, -1) ; удалить последнюю запятую
Hex := RegExReplace(Hex, "i)0a", "00") ; заменить символ новой строки 0a в формат реестра 00
Hex := RegExReplace(Hex, ".*?", "$L0") ; преобразовать в lowercase (объединение с нижним RegExReplace дает ошибку при множественной взаимной конвертации!)
Hex := RegExReplace(Hex, ".{74},(?!$)", "$0\`r`n ") ; разбить на короткие строки, добавить \ в конец строки и двойной Space вначале строки
GuiControl,, Result, % Hex
}
StrPutVar(Source, ByRef V, Encoding) {
VarSetCapacity(V, StrPut(Source, Encoding) * ((Encoding="UTF-16"||Encoding="CP1200") ? 2 : 1))
Return StrPut(Source, &V, Encoding)
}
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
; Text color functions
TxtClr(Point,FntClrStd,FntSzStd){
global
FntClrEnt := "00FF01"
FntSzEnt := FntSzStd-2.6
SetFont("c" FntClrEnt " s" FntSzEnt, Point)
Sleep 333
SetFont("c" FntClrStd " s" FntSzStd, Point)
}
SetFont(Opt, Control){
Gui Font, % Opt
GuiControl Font, % Control
}