Преобразование целого числа ip в объект ipaddress.Строка ip перевернута? - PullRequest
1 голос
/ 09 сентября 2011

Я десериализирую данные с веб-страницы, созданной php и использующей ip2long ().Однако когда я пытаюсь создать новый IP-адрес с помощью целочисленного значения в конструкторе IP-адреса, точечная версия IP-адреса находится в обратном порядке?

ex:

4.3.2.1 действительно должно быть 1.2.3.4

Есть идеи, как это исправить?

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Звучит так, как будто кто-то использует little-endian , а кто-то использует сетевой порядок байтов (big-endian) для упакованного значения.Например, последовательность октетов , компрометирующая целое число, AA,BB,CC,DD в LE равна DD,CC,BB,AA в BE / NBO - хороший симметричный обратный ход!

, поскольку IP-адрес (Int64)Документация конструктора гласит:

Предполагается, что значение Int64 находится в сетевом порядке байтов.

Я бы представлял , что ip2long в PHP генерирует значение с прямым порядком байтов.Хорошо, что IPAddress также принимает byte[] за конструктор, теперь смазывайте эти локти ... просто передавайте байты в "правильном" порядке.

Счастливое кодирование.


Код в Как преобразовать int в байтовый массив с прямым порядком байтов? должен дать некоторые идеи.


Или, как указывает Джош, существует HostToNetworkOrder способ сделать это.

0 голосов
/ 09 сентября 2011

используйте long2ip(), чтобы отменить процесс ip2long()

<?php
// make sure IPs are valid. also converts a non-complete IP into
// a proper dotted quad as explained below.
$ip = long2ip(ip2long("127.0.0.1")); // "127.0.0.1"
$ip = long2ip(ip2long("10.0.0")); // "10.0.0.0"
$ip = long2ip(ip2long("10.0.256")); // "10.0.1.0"
?>

, у вас действительно не должно быть никаких проблем, ведь это стандарт в php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...