Преобразовать массив значений в одно значение с плавающей точкой в ​​PHP?

У меня есть массив с этими значениями (когда массив печатается с print_r();

Array:
[0] => 66
[1] => 233
[2] => 204
[3] => 205

Значения в шестнадцатеричном виде:

Array:
[0] => 0x42
[1] => 0xE9
[2] => 0xCC
[3] => 0xCD

Что я хочу сделать, это превратить этот 4-байтовый массив в значение с плавающей запятой. Если я использую implode(); чтобы превратить массив в значение, он просто объединяет строку в 66233204205 вместо 0x42E9CCCD которые не похожи. Таким образом, я не могу использовать floatval(), PHP является новым для меня, и поэтому использует строковые значения вместо реальных битов, как я могу в C.

То, что я думаю, для некоторых, как implode() это с шестнадцатеричными значениями, а не этими целыми числами, а затем использовать floatval(),

Есть идеи, ребята?

РЕДАКТИРОВАТЬ:

Просто так немного яснее, я должен получить 116.900 в результате

3

Решение

Пересмотренный ответ с ….

Выполнение математики с шестнадцатеричными строками раньше было функцией, поддерживаемой в PHP. Теперь в PHP 7 шестнадцатеричная строка представляет только строку символов и больше не распознается как содержащая числовое значение. Если вы попытаетесь сделать с ним математику, результат будет нулевым. Рассмотрим следующий код:

 <?php

$arr = [66, 233, 204, 205];

$res = array_reduce( $arr, function($c,$i) {
$c.=dechex( $i );
return $c;
});

$temp = "0x" . $res;  // 0x42e9cccd
var_dump($temp + 0);

Увидеть демонстрация

Этот код пытается обеспечить шестнадцатеричную строку математическим контекстом, добавляя ноль к значению, содержащемуся в $ temp. Этот код работает до PHP 7, потому что полномочия, которые будут определены, что hexstrings создал больше проблем, чем они того стоили; видеть это RFC и руководство:«Шестнадцатеричные строки больше не считаются числовыми».

Конкатенация, будучи строковой операцией, создает шестнадцатеричную строку примера, прямое использование которой оказывается неразумным в математической операции. Будет выпущено уведомление (в PHP 7.1) с жалобами на следующее:

Примечание. Обнаружено неверно сформированное числовое значение.

Вы можете отключить отображение этого уведомления, но итоговая сумма будет равна нулю в PHP 7. Когда код работает правильно в PHP 5.6, результат 1122618573 кажется неправильным, конечно, слишком большим, чтобы его можно было разыграть как плавающее и получить значение, которое ищет ОП.

… Добросовестный обходной

    <?php$arr = [66, 233, 204, 205];
$res = array_reduce( $arr, function($c,$i) {
$c.=dechex( $i );
return $c;
});
$temp = "0x" . $res;
$int = filter_var( $temp, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX );
if (false === $int) {
throw new Exception("Invalid integer!");
}$arr = (unpack('f', pack('i', $int )));
$f = array_pop($arr);
printf("%.3f",$f);

Увидеть демонстрация

PHP распознает числовую шестнадцатеричную строку, которую возвращает array_reduce (), если вы используете filter_var () с указанными параметрами. Таким образом, вы можете получить целое число, оценивая как 1122618573, Ключевая вещь, а не целое число значение это его двоичная битовая комбинация. Заимствование из официального ответа Вот, код должен пак $ int в двоичную строку, которая впоследствии будет распаковывать как поплавок — почти. Этот результат будет возвращен в виде массива только с одним элементом. После выталкивания и захвата значения с плавающей точкой этого элемента, printf () отображает 116.900,

1

Другие решения

Вы должны выполнить простую математическую операцию, чтобы объединить шестнадцатеричные значения массива одно за другим. Алгоритм будет выглядеть так:

  • Присвойте первое шестнадцатеричное значение массива результирующей переменной, $concat в этом случае.
  • Использовать for цикл для обхода массива от 2-го элемента до n-го элемента
  • На каждой итерации цикла сдвиг влево смещает 8 раз существующее шестнадцатеричное значение результирующей переменной и помещает новое шестнадцатеричное значение в младшие 8 бит результирующей переменной.

    // Suppose $array is your original array
    $concat = $array[0];
    $count = count($array);
    for($i = 1; $i < $count; $i++){
    $concat =  ($concat << 8) + $array[$i];
    }
    
    // display concatenated hex value: 42e9cccd
    var_dump(dechex($concat));
    
    // Now do your operation on the concatenated hex value
    

Вот демо, https://eval.in/844793

2

Вы не указали, представляет ли ваш массив целое число, является ли целочисленной частью значения с плавающей запятой или является целым числом, представленным в формате IEEE 754.
В любом случае, я бы посоветовал вам взглянуть на функцию «pack».

$value = pack('i', your_value);

ВОТ вы можете найти документацию: в основном вы должны указать тип, который вы хотите получить, и, конечно же, ваши значения.
Кроме того, PHP НЕ является строго типизированным языком, поэтому в этом случае вам не нужно отличать целое число от числа с плавающей точкой. Вы можете обращаться с целым числом как с плавающей точкой и наоборот. Но если вы хотите быть на 100% уверены, просто сделайте что-то вроде этого:

$value = floatval(pack('i', your_value));

Это, конечно, зависит от машины, но я не знаю ни одной машины с PHP, которая не использует IEEE 754 float.

0

Это добавляет значения массива друг к другу (в шестнадцатеричном формате). PHP-функция dechex ().

http://php.net/dechex

dechex — от десятичного до шестнадцатеричного

$b = [66,233,204,205];
$a = dechex($b[0]);
for($x = 1; $x < count($b); $x++) {
$a = $a . dechex($b[$x]);
}
echo $a; // $a = 42e9cccd
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector