Warning: unpack(): Type f: not enough input, need 4, have 2

274
22 ноября 2017, 00:35

Задача заключается в том, чтобы создать веб-приложение, которое считает объём 3D модели.

Проблема заключается в том, что когда я начинаю считывать данные из файла(3D модель формата .stl), то вылезает данная ошибка, причём неоднократно.

<?php
$filename = "C:/xampp/tmp/" .basename($_FILES['uploadfile']['tmp_name']);
$count = 3;
$handle = fopen($filename, "rb");
$header = fread($handle, 80);
$rnum = fread($handle, 4);
$num = unpack('I', $rnum);
print_r($num);
$sum = 0;
for ($i = 0; $i< $num; $i++) {
    $contents = fread($handle, 4);
    $normal1 = unpack('f', fread($handle, 4));
    $contents = fread($handle, 4);
    $normal2 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $normal3 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex11 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex12 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex13 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex21 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex22 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex23 = unpack('f', $contents);

    $contents = fread($handle, 4);
    $vertex31 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex32 = unpack('f', $contents);
    $contents = fread($handle, 4);
    $vertex33 = unpack('f', $contents);
    $atrib = fread($handle, 2);
    $sum = $sum + ((float)$vertex31 * (float)$vertex22);//на формулу не обращайте внимания. Просто тест.
} 
fclose($handle);
print($sum);
?>
Answer 1

http://php.net/manual/ru/function.pack.php

f float (машинно-зависимые размер и представление)

g float (машинно-зависимые размер, порядок байт little endian)

https://ru.wikipedia.org/wiki/STL_(%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0)

Числа с плавающей запятой представляются в виде IEEE числа с плавающей запятой и считается обратным порядком байтов, хотя это не указано в документации.

попробуйте поменять f на g в своём коде.

unpack('f', $contents); => unpack('g', $contents);

Оффтопик: Имена переменных ужасны.

READ ALSO
Как создать модель в Laravel 4.2 из консоли?

Как создать модель в Laravel 4.2 из консоли?

Доброго времениКаким образом можно создать модель в Laravel 4

243
Empty test suite. No tests executed

Empty test suite. No tests executed

У меня проект на Laravel 55 Я хочу запустить тесты, но о какой-то причине даже ExampleTest не запускается, пишет Empty test suite

199
Не вызывается метод

Не вызывается метод

При пустых полях выводится "Empty query!", а то что должна вывести функция admin_login() отсутствует, почему так?

179
Кто нибуть подскажет статью на русском по Gmagick

Кто нибуть подскажет статью на русском по Gmagick

Добра всемКто нибуть сталкивался с классом Gmagick

219