$sFirst = '0917D4D1A46AE811'
$sSecond = ''
$bFirst = Binary('0x' & $sFirst)
For $i = BinaryLen($bFirst) To 1 Step -1
$sSecond &= Hex(BinaryMid($bFirst, $i, 1), 2)
Next
MsgBox(64, 'Info', $sFirst & @LF & $sSecond)
;или
$sSecond = ''
For $i = StringLen($sFirst) - 1 To 1 Step - 2
$sSecond &= StringMid($sFirst, $i, 2)
Next
MsgBox(64, 'Info', $sFirst & @LF & $sSecond)
Я в регулярных выражениях полный нольЕсли всегда 8-значное, то можно одной регуляркой поменять, без цикла
Вот так примерно:Если всегда 8-значное, то можно одной регуляркой поменять, без цикла
$vTest = '0917D4D1A46AE811'
$sPtrn = '([[:xdigit:]]{2})'
$sRet = StringRegExpReplace($vTest, $sPtrn & $sPtrn & $sPtrn & $sPtrn & $sPtrn & $sPtrn & $sPtrn & $sPtrn, '$8$7$6$5$4$3$2$1')
ConsoleWrite("Result: " & $sRet & @LF)
$sRet=StringRegExpReplace($vTest, '(..)(..)(..)(..)(..)(..)(..)(..)', '\8\7\6\5\4\3\2\1')
#Include <String.au3>
$Hex='0917D4D1A46AE811'
$String = _HexToString($Hex)
$String=_StringReverse($String)
$Hex = _StringToHex($String)
MsgBox(0, 'Message', $Hex)
Тут не учитывается Hex.или так
Тут исполльзуются циклыЕщё такой вариант
$Result = _HexStringReverse('0917D4D1A46AE811')
ConsoleWrite($Result & @LF)
Func _HexStringReverse($nHex)
$aRet = StringRegExp($nHex, '([[:xdigit:]]{2})', 3)
$sRet = ''
For $i = UBound($aRet)-1 To 0 Step -1
$sRet &= $aRet[$i]
Next
Return $sRet
EndFunc
Хм... если я изменяю тип данных с Byte на Int64 в структуре тогда возвращается не то что нужно.А еще разумнее будет правильно считывать эти 8 байт из памяти (тип "INT64"), и все будет автоматически "перевернуто".
#Include <WinAPIex.au3>
#Include <WinAPI.au3>
Global $sDrive, $ibufer, $filebufer
$sDrive = 'C:'
;============== Считываю данные с загрузочного сектора и сохроняю их на диск =====================
$strBufer = DllStructCreate("byte[512]") ; создаем структуру (будем считывать 512 байт )
$hDisk = _WinAPI_CreateFile('\\.\' & $sDrive, 2 ,2 + 4 , 2 + 4 ) ; подключаюсь к тому
_WinAPI_SetFilePointerEx ( $hDisk,0,$FILE_BEGIN) ; устанвливаю позицию для считывания, т.к будем читать весь сектор позиция равна 0
_WinAPI_ReadFile($hDisk, DllStructGetPtr($strBufer,1), 512,$ibufer) ; Читаю загрузочный сектор полностью
_WinAPI_CloseHandle($hDisk ) ; Закрываю Handle
$sfile = FileOpen("C:\Damp.Txt", 16+2) ; Создаю файл для сохранения в нем считынных байт
FileWrite("C:\ByteF.Txt",DllStructGetData($strBufer, 1)) ; Сохраняю данные
FileClose($sfile) ; закрываю файл
;=============== Читаю данные из сохраненного файла и вывожу их в понятной форме =========
$file =_WinAPI_CreateFile("C:\Damp.Txt", 2 ,2 ) ; Открываю файл
$strFile= DllStructCreate("byte[8]") ; создаем структуру (будем считывать 8 байт )
_WinAPI_SetFilePointerEx ( $file,72,$FILE_BEGIN) ; Устанавливаю позицию для считывания необходимой информации (серийный номер тома)
_WinAPI_ReadFile($file , DllStructGetPtr($strFile,1), 8,$filebufer) ; Читаю
_WinAPI_CloseHandle($file ) ; Закрываю Handle
$text = DllStructGetData($strFile, 1)
ConsoleWrite($text& @CRLF ) ; Вывожу данные
$tData = DllStructCreate("byte[512]")
$tVal = DllStructCreate('int64', DllStructGetPtr($tData) + 72)
$iVal = DllStructGetData($tVal, 1)
;=============== Читаю данные из сохраненного файла и вывожу их в понятной форме =========
$file = _WinAPI_CreateFile("C:\Damp.Txt", 2, 2) ; Открываю файл
$strFile = DllStructCreate("int64") ; создаем структуру (будем считывать 8 байт )
_WinAPI_SetFilePointerEx($file, 72, $FILE_BEGIN) ; Устанавливаю позицию для считывания необходимой информации (серийный номер тома)
_WinAPI_ReadFile($file, DllStructGetPtr($strFile, 1), 8, $filebufer) ; Читаю
_WinAPI_CloseHandle($file) ; Закрываю Handle
$text = Hex(DllStructGetData($strFile, 1))
ConsoleWrite($text & @CRLF) ; Вывожу данные
Я с Вами полностью согласен (зачем их перевертывать ???), НО все программы, отображающее серийный номер тома именно отображают его перевернутым. Сам не знаю почему...А какой вообще смысл отображать данные в перевернутом виде? Вы ведь читаете 512 последовательных байт. Это и есть правильная информация. Зачем ее нужно "перевертывать"?
$s0 = "80629"
;MsgBox(0, "", $s0)
$s1 = Hex($s0)
MsgBox(0, "", $s1)
$s2 = Binary("0x" & $s1)
$s3 = BitRotate($s2, 0)
$s4 = Hex($s3)
MsgBox(0, "", $s4)
;$s5 = Int(Binary("0x" & $s4))
;MsgBox(0, "", $s5)
$reverse = Hex(BitRotate(Binary("0x" & Hex("80629")),0))