Что нового

[Данные, строки] Работа функции Binary()

Renz

Осваивающий
Сообщения
63
Репутация
37
В первом результате происходит разворот числа, во втором нет. Как получить обратно переменную $x.
Вот пример:
Код:
$x = 0x1f2b
$rez1 = Binary($x)
$rez2 = Binary($rez1)
MsgBox (1,"Результат","rez1= " & $rez1 & " rez2= " & $rez2 )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Binary - это непрерывная последовательность байт (однобайтовых чисел), а 0x1F2B - четырехбайтовое число. Это не одно и тоже. В случае последнего, все значения хранятся в памяти компьютера задом наперед, отсюда и непонятки. Можно написать так:

Код:
$Val = 0x1F2B
$Bin = Binary('0x' & Hex($Val, 4))
$Val = Number(String($Bin))
MsgBox(1, "Результат", "Bin = " & $Bin & ", Val = 0x" & Hex($Val, 4))


или так (смотря, какой тип данных тебе нужно):

Код:
$Str = "0x1F2B"
$Bin = Binary($Str)
$Str = String($Bin)
MsgBox(1, "Результат", "Bin = " & $Bin & ", Str = " & $Str)
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Мне необходимо преобразовывать бинарное число вот так:
0x1f2b4c2a --> 0x2a4c2b1f --> 0x1f2b4c2a

Код:
$x = 0x1f2b4c2a
 ;0x1f2b4c2a --> 0x2a4c2b1f
 $rez1 = Binary($x)
 ;0x2a4c2b1f --> 0x1f2b4c2a
 $rez2 = Binary($rez1)
 MsgBox (1,"Результат","rez1= " & $rez1 & " rez2= " & $rez2 )


При первом использовании Binary() происходит разворот, при втором нет. Тогда как реализовать? Привести $rez1 к типу как у $x при объявлении?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
$x = 0x1f2b4c2a
;0x1f2b4c2a --> 0x2a4c2b1f
$rez1 = Binary($x)
;0x2a4c2b1f --> 0x1f2b4c2a
$rez2 = Number($rez1)
MsgBox(1, "Результат", "rez1= " & $rez1 & " rez2= 0x" & Hex($rez2))
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Упс :smile: Немного не успел. А вот мой вариант, на выходе бинарное число:

Код:
$x = 0x1f2b4c2a
 ;0x1f2b4c2a --> 0x2a4c2b1f
 $rez1 = Binary($x)
 ;0x2a4c2b1f --> 0x1f2b4c2a
 $rez2 = Binary(Dec(Hex($rez1)))
 MsgBox (1,"Результат","rez1= " & $rez1 & " rez2= " & $rez2 )


Yashied у тебя на выходе строка если применить Binary() в результате получим:
0x2a4c2b1f --> 0x2a4c2b1f
Спасибо за внимание к теме :beer:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ты совсем меня запутал. Если нужно просто менять порядок байт в 4-байтовом числе, то проще так:

Код:
$Val = 0x1F2B4C2A

ConsoleWrite(Hex($Val) & @CR)
$Val = _SwapEndian($Val)
ConsoleWrite(Hex($Val) & @CR)
$Val = _SwapEndian($Val)
ConsoleWrite(Hex($Val) & @CR)

Func _SwapEndian($iValue)
	Return BitOR(BitShift(BitAND($iValue, 0x000000FF), -24), BitShift(BitAND($iValue, 0x0000FF00), -8), BitShift(BitAND($iValue, 0xFF000000), 24), BitShift(BitAND($iValue, 0x00FF0000), 8))
EndFunc   ;==>_SwapEndian


P.S

Binary это не число.
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Спс за ответ.

PS
Это в протоколе mrim : "Все числовые данные передаются как четырехбайтные целые"

Не, для меня проще так:
Код:
$rez2 = Binary(Dec(Hex($rez1)))
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Renz сказал(а):
Все числовые данные передаются как четырехбайтные целые.

Тогда и нужно считывать их как 4-байтные целые, они автоматически "перевернуться". Когда ты помещаешь в память чило, оно "переварачивается". При его считывании из памяти, "восстанавливается" обратно. И нет никакой необходимости заниматься этим вручную.
 
Верх