Что нового

[Данные, строки] PHP функция Unpack() для AutoIt

DjReactive

Новичок
Сообщения
17
Репутация
0
Здравствуйте, хотелось бы узнать: как можно представить Функцию Unpack() PHP (http://php.net/manual/ru/function.unpack.php) для Autoit.
Интересует в данный момент меня Unpack('f', $data) для типа float.

Заранее спасибо.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
DjReactive [?]
Интересует в данный момент меня Unpack('f', $data) для типа float.
Код:
$Struct = DllStructCreate('float f')
DllStructSetData( DllStructCreate( 'byte[4]', DllStructGetPtr( $Struct ) ), 1, $data )

;Result
$Float = $Struct.f


UPD:
Garrett
Есть один грешок :smile:
Исправил.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Мне просто любопытно, ответ отмечен как лучший, а ошибку в коде только я вижу? :smile:


Добавлено:
Сообщение автоматически объединено:

firex [?]
:ok:
И еще один момент.
IMHO, вот так будет правильнее.
Код:
$bData = '0x1A'
$pFloat = DllStructCreate('float f')
DllStructSetData(DllStructCreate('char[4]', DllStructGetPtr($pFloat)), 1, $bData )
ConsoleWrite(StringFormat('%s\n', $pFloat.f)) ; 11.091842651367


PHP:
<?php
$bindata = '0x1A';
$array = unpack("f", $bindata);
var_dump($array); // 11.091842651367
?>
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Garrett
Это мне известно, только вот какое отношение ваш пример имеет к выше поставленной задаче? :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
firex
То есть вы считаете разницы нет?!
Код:
$data = '0x41'
$Struct = DllStructCreate('float f')
DllStructSetData( DllStructCreate( 'byte[4]', DllStructGetPtr( $Struct ) ), 1, $data )
ConsoleWrite(StringFormat('%s\n', $Struct.f))
;Result: 9.10844001811131e-044

$Struct = DllStructCreate('float f')
DllStructSetData( DllStructCreate( 'char[4]', DllStructGetPtr( $Struct ) ), 1, $data )
ConsoleWrite(StringFormat('%s\n', $Struct.f))
;Result: 2.62617660951037e-009
 
Автор
D

DjReactive

Новичок
Сообщения
17
Репутация
0
Да, ошибка была в количестве заданных параметров в DLLStructSetData, но главное идея понятна. Я разобрался))) Спасибо!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно так:

Код:
_WinAPI_DWordToFloat(StringToBinary($bData))
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Garrett [?]
То есть вы считаете разницы нет?!
Я вас совершенно не понимаю. Что за глупости? Зачем путаете людей?

Буфером(RAW DATA) у нас принят ОДИН байт, к примеру 0x1A. Это сырые данные, преобразовать их следует в тип FLOAT.
Код:
$data = '0x1A'

$Struct = DllStructCreate('float f')

$Struct_Byte = DllStructCreate( 'byte f[4]', DllStructGetPtr( $Struct ) )
$Struct_Char = DllStructCreate( 'char f[4]', DllStructGetPtr( $Struct ) )


$Struct_Byte.f = $data ;Записываем данные как массив байт
ConsoleWrite( 'Читаем буфер как массив char: "' & $Struct_Char.f & '"' & @CRLF)
ConsoleWrite( 'Читаем буфер как массив байт: ' & $Struct_Byte.f & @CRLF)

ConsoleWrite(@CRLF)

$Struct_Char.f = $data ;Записываем данные как массив char
ConsoleWrite( 'Читаем буфер как массив char: "' & $Struct_Char.f & '"' & @CRLF)
ConsoleWrite( 'Преобразуем его в массив байт: ' & StringToBinary($Struct_Char.f) & @CRLF)
ConsoleWrite( 'И читаем эти данные как массив байт: ' & $Struct_Byte.f & @CRLF)

ConsoleWrite(@CRLF)

ConsoleWrite( "Улавливаете? AutoIt интерпретирует 0x1A не как RAW BINARY, а как STRING" & @CRLF)


В вашем случае вы преобразуете в тип FLOAT данные 0x30783141 = "0x1A"
В моем случае я преобразую в тип FLOAT данные 0x41000000 = "A"

P.S. Касательно моего примера - надо учесть, что при таком преобразовании AutoIt интерпретирует 0x1A как 0x1A000000, а не как полагается - 0x0000001A, но это не касается вашей проблемы.
 
Верх