LINUX.ORG.RU

php и int64_t


0

1

Мне нужно в php читать из файла строки вида ffffffffffffffff (шестнадцатиричное представление int64_t производить с ними сложение/вычитание и записывать в файл. Проблема в том что не получается работать с такими большими числами, смотрите:

$ php test.php 
gettype(a): integer
a:-1
b:ffffffffffffffff
gettype(b): string
gettype(b): integer
b:0
c:1.844674407371E+19
gettype(c): double
gettype(c): integer
c:0
<?php

$a = 0;
settype($a, 'integer');
echo "gettype(a): ".gettype($a)."\n";
$a -= 1;
echo "a:".$a."\n";

$b = dechex($a);

echo "b:".$b."\n";
echo "gettype(b): ".gettype($b)."\n";
settype($b, 'integer');
echo "gettype(b): ".gettype($b)."\n";
echo "b:".$b."\n";

$c = 0xffffffffffffffff;
echo "c:".$c."\n";
echo "gettype(c): ".gettype($c)."\n";
settype($c, 'integer');
echo "gettype(c): ".gettype($c)."\n";
echo "c:".$c."\n";

?>
★★★★

Последнее исправление: quest (всего исправлений: 2)

Если число больше PHP_INT_MAX, то никак. Если нужен переход между 32 и 64, то можно заюзать pack+unpack с дикой потерей перфоманса.

Какая платформа? 32, 64?

Что происходит при использовании BCMath или GMP?
http://www.php.net/manual/en/ref.bc.php
http://www.php.net/manual/en/ref.gmp.php

(если будешь их юзать - сразу подключай профайлер!)

stevejobs ★★★★☆
()

Допиши в конец своего скрипта вот это:

#если конвертировать туда-сюда, информация теряется
$e = intval($d);
echo "gettype(e): ".gettype($e)."\n";
echo "e:".$e."\n";
$f = strval($e);
echo "gettype(f): ".gettype($f)."\n";
echo "f:".$f."\n";
# если заюзать GMP, то нет
## extension=php_gmp.dll > php.ini
$g = '0xffffffffffffffff';
echo "gettype(g): ".gettype($g)."\n";
echo "g:".$g."\n";
$h = gmp_init($g);
echo "gettype(h): ".gettype($h)."\n";
echo "g:".$h."\n";
$i = gmp_strval($h);
echo "gettype(i): ".gettype($i)."\n";
echo "i:".$i."\n";
$f = gmp_intval($h);
echo "gettype(f): ".gettype($f)."\n";
echo "f:".$f."\n";
# наводит на размышления, правда?
$gmp_php_int_max = gmp_init(PHP_INT_MAX);
if (gmp_cmp($h,$gmp_php_int_max)>0) {
	echo "а все потому, что твое число больше INT_MAX";
}
# используй длинную арифметику, подружись с тормозами!
stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

На перформанс наплевать, там буквально несколько операций, будет нужен перформанс перепишу на fastcgi C. Кстати может посоветуете замену php что то с простым C подобным синтаксисом умеющее выполнятся как консольное приложение, cgi, fastcgi. Либо для таких задач буду и дальше php юзать (вот только по времени разработки из за таких косяков оно уже C переплюнуло) либо найду замену либо буду уже сразу на C писать...

quest ★★★★
() автор топика
Ответ на: комментарий от rikardoac

Чую что попробую сейчас

quest ★★★★
() автор топика
Ответ на: комментарий от stevejobs

Платформа 64, но вообще хотелось бы код который будет и на 32 работать, впрочем это не цель

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Ты либо виндузятник:

x86_64 Builds

The x64 builds of PHP for Windows should be considered experimental, and do not yet provide 64-bit integer or large file support. Please see this post for work ongoing to improve these builds.

Либо просто забыл, что для проверки 64-bit надо писать не 16 буков f подряд, а 7 и потом 15 буков f подряд :)

Если надо произвольную длину, кроссплатформу, и наплевать на перфоманс юзай PHP+GMP как у мну в примере, GMP теперь стандарт.

Я юзаю скалу, отличная надежная штука, но она не fastcgi. Когда Си и Кресты сегфолтятся на сервере, это грустно, а скала не сегфолтится.

stevejobs ★★★★☆
()
Ответ на: комментарий от quest

Кстати может посоветуете замену php что то с простым C подобным синтаксисом умеющее выполнятся как консольное приложение, cgi, fastcgi

Go?

theNamelessOne ★★★★★
()
Ответ на: комментарий от quest

Напиши расширение на C, которое будет работать с данными. Тем более, что это довольно просто (если создавать просто пару функций, конечно).

По языку - очень впечатлил луа, но он, скорее, васикоподобный.

rikardoac
()
Ответ на: комментарий от stevejobs

Ты либо виндузятник:

Нет я НЕ виндузятник)

для проверки 64-bit надо писать не 16 буков f подряд, а 7 и потом 15 буков f подряд :)

я -1 хочу, заметь в моем изначальном примере dechex на -1 и выдает шестнадцать f

юзай PHP+GMP как у мну в примере

Спасибо, попробую

Когда Си и Кресты сегфолтятся на сервере, это грустно, а скала не сегфолтится.

Ну сегфолт то отлавливается элементарно обычно

quest ★★★★
() автор топика
Ответ на: комментарий от rikardoac

Если он читает из файла именно _строки_, Си ему, наверное, никак не поможет. А длинную арифметику руками писать не надо, есть уже готовый стандартный сишный модуль GMP.

stevejobs ★★★★☆
()

меня D заинтересовал что его можно юзать и как интерпретатор и как компилятор, хз как у него с fastcgi и вообще с производительностью

quest ★★★★
() автор топика
Ответ на: комментарий от stevejobs

:-)

Там есть специальный индексный файл, так что конкретно дисковые операции дешевые

quest ★★★★
() автор топика
Ответ на: комментарий от anonymous

даже жаба более перспективна и думаю переживет его

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Кстати может посоветуете замену php что то с простым C подобным синтаксисом умеющее выполнятся как консольное приложение, cgi, fastcgi.

Как ruby так и python имеют целые числа неограниченного размера. Удивлён что их до сих пор никто не посоветовал а вместо этого советуют какую то малоизвестную java-чушь.

tyler19
()
Ответ на: комментарий от tyler19

Ты опять выходишь на связь, чудило?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.