Как уже упоминалось в комментарии Джерри, вы получите краткий учебник о том, как создавать гистограмму с накоплением. Например, , этот .
Поскольку ваши данные очень малы, я продемонстрирую, как это сделать быстро и просто:
Во-вторых, вам нужно выбрать диапазон ячеек A1
- C9
и выбрать столбчатую диаграмму с накоплением под диаграммами (также показано в ссылке выше).
Это создаст вашу гистограмму с накоплением
338
, см. скриншот ниже (на голландском, но вы поймете): PHP не поддерживает целые числа без знака как тип, но вы можете просто превратить результат ip2long в строку int без знака , имея sprintf интерпретировать значение как беззнаковое с помощью % u
:
$ip="128.1.2.3";
$signed=ip2long($ip); // -2147417597 in this example
$unsigned=sprintf("%u", $signed); // 2147549699 in this example
Edit, поскольку вы действительно хотели, чтобы оно было подписано даже в 64-битных системах - вот как вы преобразовали бы 64 значение бит + ве для 32-битного эквивалента со знаком:
$ip = ip2long($ip);
if (PHP_INT_SIZE == 8)
{
if ($ip>0x7FFFFFFF)
{
$ip-=0x100000000;
}
}
-Непонятная проблема, см. Ответ Пола Диксона выше.
64-битные целые числа без знака технически не поддерживаются в PHP5. Он будет использовать собственный тип. Чтобы преобразовать в 32-битное подписанное int из 64-битного подписанного int без потери старшего бита, вы можете замаскировать, а затем ввести приведение вывода:
$ip_int = ip2long($ip);
if (PHP_INT_SIZE == 8) // 64bit native
{
$temp_int = (int)(0x7FFFFFFF & $ip_int);
$temp_int |= (int)(0x80000000 & ($ip_int >> 32));
$ip_int = $temp_int;
}
В 64-битной системе при печати этого значения ($ ip_int) будет отображаться 'unsigned' целое число, поскольку мы удалили старший бит. Однако это должно позволить вам взять результат и сохранить его так, как вы хотите.
]Fwiw, если вы используете MySQL, то обычно гораздо проще и чище, если вы просто передаете IP как строки в базу данных, и позволяете MySQL делать преобразование с помощью INET_ATON() (когда INSERTing/UPDAT(E)'ing) и INET_NTOA() (когда SELECTing). В MySQL нет ни одной из описанных здесь проблем.[
] []Примеры:[
] [SELECT INET_NTOA(ip_column) FROM t;
INSERT INTO t (ip_column) VALUES (INET_ATON('10.0.0.1'));
]
[]Запросы также намного более читабельны.[
] []Обратите внимание, что вы можете []не[] смешивать INET_NTOA()/INET_ATON() в MySQL с ip2long()/long2ip() в PHP, так как MySQL использует тип данных INT UNSIGNED, в то время как PHP использует []подписанное[] целое число. Смешивание подписанных и неподписанных целых чисел серьезно испортит ваши данные![
].