Что нового

Изменение двоичных данных

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Уже который час не могу просуммировать часть массива типа Binary, и обратно записать в тот же массив.

Код:
$bin = '0x01020304050607080910'
ConsoleWrite($bin & @CRLF)
$num = BinaryMid($bin, 1, 4)
$num = ('0x' & Hex(BinaryMid($num, 4, 1)) & Hex(BinaryMid($num, 3, 1)) & Hex(BinaryMid($num, 2, 1)) & Hex(BinaryMid($num, 1, 1))) +  0x10101010
; возвращает верное значение $num = 336794129 или 0x14131211
ConsoleWrite($num & @CRLF)
$bin = Binary($num) & BinaryMid($bin, 5)
; выводит 0x000000111213B441050607080910
ConsoleWrite($bin & @CRLF)

Необходимо записать полученный адрес обратно в двоичный массив (или как он называется).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Z_Lenar,
ИМХО, лучше объяснить что Вы хотите получить.
 
Автор
Z

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Имеется массив с двоичными данными $bin. Необходима вытащить оттуда двойное слово, произвести арифметические операции и заменить им исходное значение. Двойное слово в формате адресации Intel (Little Endian), т.е. старший байт двойного слова располагается в 4 байте.
 

_dron_

Знающий
Сообщения
84
Репутация
8
Код:
$bin = '0x01020304050607080910'
ConsoleWrite($bin & @CRLF)

$sTmp = DllStructCreate('byte[' & BinaryLen($bin) & ']')
DllStructSetData($sTmp,1,$bin)

$sBuff = DllStructCreate('int n1;int n2;byte[2]',DllStructGetPtr($sTmp))

$iNumber = DllStructGetData($sBuff,'n1')

DllStructSetData($sBuff, 'n1', $iNumber + 0x10101010)
ConsoleWrite($iNumber + 0x10101010 & @CRLF);336794129

$bin = DllStructGetData($sTmp,1)
ConsoleWrite($bin & @CRLF);0x11121314050607080910


надеюсь что понятно...
 
Автор
Z

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
_dron_
Спасибо за ответ, но этот вариант для меня не подходит т.к. позиции изменяемых данных динамические. Т.е. получится слишком большой код.
 

_dron_

Знающий
Сообщения
84
Репутация
8
Ну если тебе нужно так как у тебя в коде то нужно брать в расчет что числа в Autoit Int64 (я точно не знаю когда из бинарных данных будет получено 32x / 64x если прямо не указывать Int('0x0012345678907645',1)) то есть из 8 байт и при преобразовании число-байты нужно отсекать лишнии :blink:
зы Autoit работает с little-endian числами
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Z_Lenar,
Вроде так работает.
Код:
Local $bData = Binary('0x01020304050607080910'), $iStart = Random(1, 7, 1), $bNum = 0x10101010

$bData = BinaryMid($bData, 1, $iStart - 1) & Binary(Int(BinaryMid($bData, $iStart, 4)) + Int($bNum)) & BinaryMid($bData, $iStart + 4)
ConsoleWrite($iStart & @TAB & $bData & @LF)
ConsoleWrite('---' & @LF)
For $i = 1 To 7
	$bData = Binary('0x01020304050607080910')
	$iStart = $i
	$bData = BinaryMid($bData, 1, $iStart - 1) & Binary(Int(BinaryMid($bData, $iStart, 4)) + Int($bNum)) & BinaryMid($bData, $iStart + 4)
	ConsoleWrite($iStart & @TAB & $bData & @LF)
Next
 
Автор
Z

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Как я понял для склеивания данных двоичного типа нужно их записывать их в форме '0x...'. Всем спасибо, разобрался.
 
Верх