Помогите поместить число 4294967295 в 4 байта!!!

jeka!

Просто Member
Помогите поместить число 4294967295 в 4 байта!!!

Блин, умучился, надо поместить число 4294967295 в 4 байта, по моим тестам с pack() выходит что максимально возможный диапазон равен -2147483648 - 2147483647
В общем параметры i,N,V,l,L ведут себя одинаково, хотя в мануале написано что L - это long без знаковый, но на практике он ещё какой знаковый...
Реально вобще упаковать это число в 4 байта или надо в 8 укладывать?
Просто в mysql это число храниться в 4 байтах, хочу так-же...
 

fixxxer

К.О.
Партнер клуба
Note that PHP internally stores integral values as signed. If you unpack a large unsigned long and it is of the same size as PHP internally stored values the result will be a negative number even though unsigned unpacking was specified.
 

jeka!

Просто Member
fixxxer
Наверное то что тут написано, это:

Обратите внимание, что PHP внутренне хранит интегральные значения как знаковые. Если вы unpack большое unsigned long и оно имеет тот же размер, что внутренне хранимые PHP значения, результатом будет отрицательное число, даже если была специфицирована беззнаковая распаковка.

И как тогда решить проблему то?

Вобще мне надо поместить ip-адрес в файл,
максимально возможный это 255.255.255.255 который после преобразования получается числом 4294967295
Хотелось бы, чтобы оно помещалось всё же в 4 байта...
И потом от туда так же читалось...
 

jeka!

Просто Member
Да не получается сделать преобразование туда и обратно.
Я делаю счётчик, так вот, как сделать нечто подобное на PHP?
Вот пример на Perl:

PHP:
#!/usr/bin/perl

sub iplong {
	my @i=split(/\\./,$_[0]);
	pack("L",$i[0]*256*256*256+$i[1]*256*256+$i[2]*256+$i[3])
}

sub longip {
	my $int=unpack("L",$_[0]);
	my $i1=int($int/256/256/256);
	my $i2=int(($int-$i1*256*256*256)/256/256);
	my $i3=int(($int-$i1*256*256*256-$i2*256*256)/256);
	my $i4=int($int-$i1*256*256*256-$i2*256*256-$i3*256);
	"$i1.$i2.$i3.$i4"
}

$binary_ip=iplong($ENV{'REMOTE_ADDR'}); # 4 байта
$string_ip=longip($binary_ip); # строка

print "Content-Type: text/html\n\n";
print $string_ip;
На php у меня не получается...
 

AnToXa

prodigy-одаренный ребенок
жека, хватит гнать пургу

[m]ip2long[/m]
[m]long2ip[/m]
 

jeka!

Просто Member
Автор оригинала: AnToXa
жека, хватит гнать пургу

[m]ip2long[/m]
[m]long2ip[/m]
Какую пургу?
Вот ваш пример, он ничего не даёт:
PHP:
$ip=sprintf("%u",ip2long("255.255.255.255"));
$binary=pack("L",$ip); // упаковано в 4 байта

// Распаковка
$ip=unpack("Lint/",$binary);
$b=long2ip($ip['int']);
echo $b; // выводит 127.255.255.255 вместо 255.255.255.255
Адрес 255.255.255.255 должен быть числом 4294967295
А после распаковки он получается максимальным знаковым, вдвое меньше чем 4294967295.

А мне нужно полное преобразование туда и обратно, чтобы сохранить адрес в файле, потом извлечь от туда.
Если сохранить ещё можно, но потом считать его не получается.
На перле всё просто, а ПХП не даёт такой возможности...
 

Stm

Новичок
а зачем $ip=sprintf("%u",ip2long("255.255.255.255"));

вот так у меня выводит 255.255.255.255
$binary=pack("L",ip2long("255.255.255.255"));
$ip=unpack("Lint/",$binary);
echo long2ip($ip['int']);
 

jeka!

Просто Member
И чего тогда делать не пойму? Выходит, что прочитать например ip 255.255.255.255 из файла будет не реально?
Ну и лажу придумали эти расработчики ПХП, со своими знаковыми числами.
Что не могли сделать как в перле что-ли?
 

SiMM

Новичок
Автор оригинала: jeka!
прочитать например ip 255.255.255.255 из файла будет не реально?
Вот это и есть "пурга". Если уж тебе настолько приспичило беззнаковое значение (интересно, правда, зачем?), то проблема легко решается
PHP:
$ip=-1;
if ($ip<0) $ip += 4294967296;
echo $ip;
 
Сверху