Регфайл, синтаксис.

Аватара пользователя
semiono

Re: Регфайл, синтаксис.

Сообщение semiono »

Получается следующий результат:



Код: Выделить всё

$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
MsgBox(0, 'Строка для reg-файла', _StringToRegFileFormat($sSerial, 'REG_EXPAND_SZ'))
Func _StringToRegFileFormat($sData, $sType, $iSlash=10)
    Local $sHex, $iHexLength, $aData, $sDataResult, $i, $j=4
    If $iSlash < 0 OR ($iSlash > 0 AND $iSlash < 4) Then $iSlash = 4
    Switch $sType
        Case 'REG_DWORD'
            Return 'dword:' & Hex($sData, 8)
        Case 'REG_BINARY'
            $sType = 'hex:'
            $iHexLength = 3
        Case 'REG_EXPAND_SZ'
            $sType = 'hex(2):'
            $iHexLength = 2
        Case 'REG_MULTI_SZ'
            $sType = 'hex(7):'
            $iHexLength = 7
        Case Else
            Return '"' & $sData & '"'
    EndSwitch
    $sData = StringLower(Hex(StringToBinary($sData, 2), $iHexLength))
    For $i=1 To StringLen($sData) Step 2
        $sDataResult &= StringMid($sData, $i, 2) & ','
        If $j == $iSlash Then
            $j = 0
            $sDataResult &= '\' & @CRLF
        EndIf
        $j += 1
    Next
    Return $sType & $sDataResult & '00,00'
EndFunc
Аватара пользователя
proxy

Re: Регфайл, синтаксис.

Сообщение proxy »

Цитата semiono:



Минимальная строка содержит 22 байта разделённых запятыми, и начинает убавляться на один байт
Регфайл, синтаксис.




Откуда инфа? Вручную? У меня тогда немного по другому это сформулировано:

Если длина строки более 76 символов - выполняется перенос. Следующая строка содержит в начале два пробела.





Вроде что-то написал Изображение Работает вроде правильно. Пока проблемка с нулевым значением. Да и сам код выглядит громоздко.
Аватара пользователя
SyDr

Re: Регфайл, синтаксис.

Сообщение SyDr »

Цитата:



Вроде что-то написал Изображение Работает вроде правильно. Пока проблемка с нулевым значением. Да и сам код выглядит громоздко.



а код чего? на тему топик-стартера?
Аватара пользователя
proxy

Re: Регфайл, синтаксис.

Сообщение proxy »

Цитата:



Вроде что-то написал Изображение Работает вроде правильно. Пока проблемка с нулевым значением. Да и сам код выглядит громоздко.



а код чего? на тему топик-стартера?
Аватара пользователя
SyDr

Re: Регфайл, синтаксис.

Сообщение SyDr »

Да.

Изменил немного. Стало меньше. Но всё равно много (хотя, в принципе, знаю как ещё больше можно уменьшить):

Код: Выделить всё

Func RegValueReadAndConvert($KeyName, $ValueName)
    Local $Data = RegRead($KeyName, $ValueName)
    Local $Type = @extended
    Local $Return = '"' & $ValueName & '"='
    Local $Temp = ""
    Local $ArrT[1]
    Switch $Type
        Case $REG_SZ
            Return $Return & '"' & $Data & '"'
        Case $REG_EXPAND_SZ
            $Data = StringReplace(StringToBinary($Data, 2), "0x", "")
            $Temp = $Return & "hex(2):"
            $Length = StringLen($Data) / 2
            For $i = 1 To $Length + 3
                If $I < $Length + 1 Then
                    $Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
                Else
                    $Temp &= "00"
                    If $I < $Length + 3 Then $Temp &= ","
                EndIf
                $ArrT = StringSplit($Temp, @LF)
                If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & "  " ; два пробела
            Next
            Return $Temp
        Case $REG_BINARY
            $Data = StringReplace($Data, "0x", "")
            $Temp = $Return & "hex:"
            For $i = 1 To StringLen($Data) / 2 - 1
                $Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
                $ArrT = StringSplit($Temp, @LF)
                If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & "  " ; два пробела
            Next
            $Temp &= StringMid($Data, StringLen($Data) - 1, 2)
            Return $Temp
        Case $REG_DWORD
            Return $Return & "dword:" & Hex($Data)
        Case $REG_MULTI_SZ
            $Data = StringReplace(StringToBinary($Data, 2), "0x", "")
            $Temp = $Return & "hex(2):"
            $Length = StringLen($Data) / 2
            For $i = 1 To $Length + 4
                If $I < $Length + 1 Then
                    $Temp &= StringMid($Data, $I * 2 - 1, 2) & ","
                Else
                    $Temp &= "00"
                    If $I < $Length + 4 Then $Temp &= ","
                EndIf
                $ArrT = StringSplit($Temp, @LF)
                If StringLen($ArrT[$ArrT[0]]) > 76 Then $Temp &= "\" & @CRLF & "  " ; два пробела
            Next
            Return $Temp
    EndSwitch
EndFunc
Аватара пользователя
proxy

Re: Регфайл, синтаксис.

Сообщение proxy »

+ мой вариант:



Код:

Код: Выделить всё

#region: - Options
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        1)
    Opt('TrayIconHide',         0)
#endregion
Local $sFilePath    = 'd:\reg.reg'
Local $sRegKey      = 'HKEY_LOCAL_MACHINE\SYSTEM'
Local $sValueName   = 'SN'
Local $sValueType   = 'REG_EXPAND_SZ'
Local $fAllInKey    = 1
Local $iSlash       = 10
_CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey, $iSlash)
Func _CreatRegFile($sFilePath, $sRegKey, $sValueName, $sValueType, $fAllInKey=0, $iSlash=10)
    Local Const $REG_SZ         = 1
    Local Const $REG_EXPAND_SZ  = 2
    Local Const $REG_BINARY     = 3
    Local Const $REG_DWORD      = 4
    Local Const $REG_MULTI_SZ   = 7
    Local $hFile, $i=1
    Local $sFileContent = 'Windows Registry Editor Version 5.00'
    $sRegKey = StringRegExpReplace($sRegKey, '\\+$', '')
    While 1
        If $fAllInKey Then
            $sValueName = RegEnumVal($sRegKey, $i)
            If @error <> 0 Then ExitLoop
            Switch @extended
                Case $REG_SZ
                    $sValueType = 'REG_SZ'
                Case $REG_EXPAND_SZ
                    $sValueType = 'REG_EXPAND_SZ'
                Case $REG_BINARY
                    $sValueType = 'REG_BINARY'
                Case $REG_DWORD
                    $sValueType = 'REG_DWORD'
                Case $REG_MULTI_SZ
                    $sValueType = 'REG_MULTI_SZ'
            EndSwitch
        EndIf
        $sFileContent &=  @CRLF & @CRLF & '[' & $sRegKey & ']' & @CRLF & _StringToRegFileFormat($sValueName, RegRead($sRegKey, $sValueName), $sValueType, $iSlash)
        If NOT $fAllInKey Then ExitLoop
        $i += 1
    WEnd
    $hFile = FileOpen($sFilePath, 8+2)
    FileWrite($hFile, $sFileContent)
    FileClose($hFile)
EndFunc
Func _StringToRegFileFormat($sName, $sData, $sType, $iSlash=10)
    Local   $sHex, $iHexLength, $iNameLen, $iStartLen, $aResult, $sResult, $i
    Switch $sType
        Case 'REG_DWORD'
            Return 'dword:' & Hex($sData, 8)
        Case 'REG_BINARY'
            $sType = 'hex:'
            $iHexLength = 3
        Case 'REG_EXPAND_SZ'
            $sType = 'hex(2):'
            $iHexLength = 2
        Case 'REG_MULTI_SZ'
            $sType = 'hex(7):'
            $iHexLength = 7
        Case Else
            Return '"' & $sData & '"'
    EndSwitch
    $iNameLen =  Floor(StringLen($sName & $sType) / 2)
    $sResult = StringLower(Hex(StringToBinary($sData, 2), 2))  & '0000'
    If StringLen($sResult)+(StringLen($sResult)/2)-1 > 76 Then $iSlash = 10
    If $iNameLen > $iSlash Then
        $iStartLen = 0
    Else
        $iStartLen = $iSlash - $iNameLen + 6
    EndIf
    If StringLen($sResult)+(StringLen($sResult)/2)-1 < StringLen($sName & $sType) Then $iSlash = 0
    If $iNameLen < $iStartLen Then $iStartLen = $iSlash - $iNameLen + $iSlash-4
    If Mod($iStartLen, 2) <> 0 Then $iStartLen += 1
    Dim $aResult[2]
    $aResult[0] = StringLeft($sResult, $iStartLen)
    $aResult[1] = StringMid($sResult,  $iStartLen+1)
    For $i=0 To 1
        $aResult[$i] = StringRegExpReplace($aResult[$i], '([a-z0-9]{2,2})', '\1,')
        If $i Then
            If $iSlash Then $aResult[$i] = '\' & @CRLF & StringRegExpReplace($aResult[$i], '(.{' & ($iSlash*3)-1 & '},)', '\1\\' & @CRLF)
            $aResult[$i] = StringRegExpReplace($aResult[$i], ',+$', '')
        EndIf
    Next
    $sResult = $aResult[0] & $aResult[1]
    Return '"' & $sName & '"=' & $sType & $sResult & @CRLF
EndFunc

Можно считывать как отдельную величину, так и все имеющиеся величины в ключе.

Учтено: длина строки < 76, и @CRLF в конце.

Уже лучше расставляются слеши, вся разбивка на StringRegExpReplace.
Аватара пользователя
proxy

Re: Регфайл, синтаксис.

Сообщение proxy »

Разве всё надо в hex конвертить?




Цитата proxy:



Расстановка запятых, так не проще?
Регфайл, синтаксис.




Проще. Но ещё есть "закрывающие" нули и в конце строки запятая не нужна и также разделение на строки (If StringLen > 76). Возвращаемое функцией значение соответсвует тому, что я вижу в .reg файле (без конечного @CRLF).






Цитата proxy:



потерялись?
Регфайл, синтаксис.




Я только функцию копировал. Константы были в основном скрипте.
Аватара пользователя
SyDr

Re: Регфайл, синтаксис.

Сообщение SyDr »

Цитата Sylver Dragon:



Проще. Но ещё есть "закрывающие" нули и в конце строки запятая не нужна
Регфайл, синтаксис.




ну это само собой, в скрипте, выше получается так:


Цитата:



$sData = StringLower(Hex(StringToBinary($sData, 2), $iHexLength)) & '0000'

For $i=1 To StringLen($sData) Step 2

If $j == $iSlash Then

$j = 0

$sDataResult &= '\' & @CRLF

EndIf

$j += 1

$sDataResult &= StringMid($sData, $i, 2) & ','

Next



Return '"' & $sName & '"=' & $sType & StringRegExpReplace($sDataResult, ',+$', '')







Закрывающие нули:
Цитата:



$sData = StringLower(Hex(StringToBinary($sData, 2), $iHexLength)) & '0000'





Удаление запятой:
Цитата:



StringRegExpReplace($sDataResult, ',+$', '')








Цитата:



(If StringLen > 76)



вот это упустил из виду ....76 с учетом запятых?








Цитата:



(без конечного @CRLF).



специально его убрал, а так принципиально нужен?





...
Регфайл, синтаксис.
..
Аватара пользователя
proxy

Re: Регфайл, синтаксис.

Сообщение proxy »

StringRegExpReplace($TempValue, "([^,]{2})", "$0,") - расстановка запятых после каждого второго символа (в конце тоже будет).


Цитата proxy:



вот это упустил из виду ....76 с учетом запятых?
Регфайл, синтаксис.




76 с учётом всего. И пробелов в начале и названия ключа. Ну, или другими словами если 77, 78 или 79 символов.


Цитата proxy:



специально его убрал, а так принципиально нужен?
Регфайл, синтаксис.




Ну. Если FileWriteLine - то не нужно.

Плюс, после каждого раздела следует ещё один @CRLF
Аватара пользователя
SyDr

Re: Регфайл, синтаксис.

Сообщение SyDr »

Цитата Sylver Dragon:



StringRegExpReplace($TempValue, "([^,]{2})", "$0,")
Регфайл, синтаксис.




ааагггррххх..... Изображение Круть!!
Ответить

Вернуться в «AutoIt»