Что нового

Как зеркально отобразить 8 байт в HEX - строке

VladUs

Скриптер
Сообщения
621
Репутация
181
Необходимо зеркально отобразить 8 байт в HEX - строке. т.е. первый элемент (два символа) меняется местами с последним(два символа) , а второй с предпоследним и.т.д
Пример:
Исходный вид: 0917D4D1A46AE811
Необходимый вид: 11E86AA4D1D41709
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$vTest = '0917D4D1A46AE811'
$aRet = StringRegExp($vTest, '(?i)([[:xdigit:]]{2})', 3)
$vTest = ''

For $i = UBound($aRet)-1 To 0 Step -1
	$vTest &= $aRet[$i]
Next

ConsoleWrite($vTest & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
VladUs,
Можно еще так попробовать:
Код:
$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)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
Если всегда 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)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
VladUs
или так

Код:
$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)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А еще разумнее будет правильно считывать эти 8 байт из памяти (тип "INT64"), и все будет автоматически "перевернуто".
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
Тут не учитывается Hex.

Ещё такой вариант
Тут исполльзуются циклы :blum:

Тогда вот так:
Код:
$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
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
181
Yashied [?]
А еще разумнее будет правильно считывать эти 8 байт из памяти (тип "INT64"), и все будет автоматически "перевернуто".
Хм... если я изменяю тип данных с Byte на Int64 в структуре тогда возвращается не то что нужно.
Вот самостоятельный отрывок из моего скрипта.
Суть: Скрипт открывает том (NTFS), считывает загрузочный сектор и сохраняет считанное на диск.
Далее открывает сохраненный файл и считывает необходимые данные. В данном случае серийный номер тома.

Код:
#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 )  ; Вывожу данные


Подкорректируйте код чтобы выводился сразу перевертыш.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А какой вообще смысл отображать данные в перевернутом виде? Вы ведь читаете 512 последовательных байт. Это и есть правильная информация. Зачем ее нужно "перевертывать"? Если нужно получить из этого блока, например, размер тома, то достаточно просто отобразить структуру "INT64" на нужное нам место в пределах структуры "byte[512]" и прочитать 8-байтное число.

Код:
$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) ; Вывожу данные


P.S

Посмотрите на любой Hex-редактор, там разве "перевернутое" представление данных...
 
Автор
V

VladUs

Скриптер
Сообщения
621
Репутация
181
Yashied [?]
А какой вообще смысл отображать данные в перевернутом виде? Вы ведь читаете 512 последовательных байт. Это и есть правильная информация. Зачем ее нужно "перевертывать"?
Я с Вами полностью согласен (зачем их перевертывать ???), НО все программы, отображающее серийный номер тома именно отображают его перевернутым. Сам не знаю почему...
Вот Вам пример как данные отображаются в НЕХ - редакторе и других программах.
 

NightFox

Новичок
Сообщения
1
Репутация
0
Ещё можно вот так:
Код:
$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))


Пусть тема уже старая, но может пригодится кому.
 
Верх