Проверка на 0 и 1 - хорошая идея в рекурсивном случае. Эта функция может быть вызвана рекурсивно, так что вы можете оставить это. Вы исключили рекурсию и использовали цикл for. Вот исправленный код, который ожидает, пока после цикла for не будет возвращено значение true, если текущие пары отсортированы правильно.
#include <iostream>
using namespace std;
bool IsArraySorted(int sArr[], int len)
{
//is the array ordered?
//if more than 1 element <> can do a comparison
for (int i = 0; i < len - 1; i++) {
if (sArr[i] > sArr[i + 1]) {
cout << "notOrdered" << endl; // call before return :-)
return false;
}
}
cout << "Ordered" << endl;
return true; //here it must be ordered.
}
Я использовал эти функции в маленьком веб-сайте, который я сделал однажды. Думайте, что я нашел их с php bittorrent средством отслеживания под названием OpenTracker или что-то, но не могу найти веб-сайт...
Вы привычка находят сеялки в файле потока все же. Файл потока просто содержит информацию о файлах, хэш-кодах и длинах и т.д. И некоторой информации о средстве отслеживания, которой я верю. Сколько сеялок и такого необходимо будет добраться от средства отслеживания. Можно читать о protocal в BitTorrent.org . Коммуникация, я верю, bencoded, таким образом, можно использовать эти функции для этого также. Что означает, что просто необходимо выяснить, что отправить для получения то, что Вы хотите назад.
ПРИМЕЧАНИЕ: я не записал эти три функции. Как я сказал, я нашел их в источнике средства отслеживания потока с открытым исходным кодом. Функции не прокомментированы, но имена функций вместе с print_r на результате файла потока, который Вы знаете информацию inshould быть достаточно, чтобы понять, как использовать их. Я добавил некоторый пример кода внизу, чтобы показать, как я использовал их. И они работали.
function bdecode($str) {
$pos = 0;
return bdecode_r($str, $pos);
}
function bdecode_r($str, &$pos) {
$strlen = strlen($str);
if (($pos < 0) || ($pos >= $strlen)) {
return null;
}
else if ($str{$pos} == 'i') {
$pos++;
$numlen = strspn($str, '-0123456789', $pos);
$spos = $pos;
$pos += $numlen;
if (($pos >= $strlen) || ($str{$pos} != 'e')) {
return null;
}
else {
$pos++;
return intval(substr($str, $spos, $numlen));
}
}
else if ($str{$pos} == 'd') {
$pos++;
$ret = array();
while ($pos < $strlen) {
if ($str{$pos} == 'e') {
$pos++;
return $ret;
}
else {
$key = bdecode_r($str, $pos);
if ($key == null) {
return null;
}
else {
$val = bdecode_r($str, $pos);
if ($val == null) {
return null;
}
else if (!is_array($key)) {
$ret[$key] = $val;
}
}
}
}
return null;
}
else if ($str{$pos} == 'l') {
$pos++;
$ret = array();
while ($pos < $strlen) {
if ($str{$pos} == 'e') {
$pos++;
return $ret;
}
else {
$val = bdecode_r($str, $pos);
if ($val == null) {
return null;
}
else {
$ret[] = $val;
}
}
}
return null;
}
else {
$numlen = strspn($str, '0123456789', $pos);
$spos = $pos;
$pos += $numlen;
if (($pos >= $strlen) || ($str{$pos} != ':')) {
return null;
}
else {
$vallen = intval(substr($str, $spos, $numlen));
$pos++;
$val = substr($str, $pos, $vallen);
if (strlen($val) != $vallen) {
return null;
}
else {
$pos += $vallen;
return $val;
}
}
}
}
function bencode($var) {
if (is_int($var)) {
return 'i' . $var . 'e';
}
else if (is_array($var)) {
if (count($var) == 0) {
return 'de';
}
else {
$assoc = false;
foreach ($var as $key => $val) {
if (!is_int($key)) {
$assoc = true;
break;
}
}
if ($assoc) {
ksort($var, SORT_REGULAR);
$ret = 'd';
foreach ($var as $key => $val) {
$ret .= bencode($key) . bencode($val);
}
return $ret . 'e';
}
else {
$ret = 'l';
foreach ($var as $val) {
$ret .= bencode($val);
}
return $ret . 'e';
}
}
}
else {
return strlen($var) . ':' . $var;
}
}
<час> Некоторое использование в качестве примера:
# Read a file
$content = file_get_contents("file.torrent");
$content_d = bdecode($content);
# Check if bdecode succeeded
if(empty($content_d)) exit('Something is wrong with the torrent. BDecode failed.');
# Calculate info_hash
$info_hash = sha1(bencode($content_d['info']), true);
# Calculate length
$length = 0;
function add_length($value, $key)
{
global $length;
if($key == 'length') $length += $value;
}
array_walk_recursive($content_d, 'add_length');
Google придумывает этот клиент PHP на SourceForge и этот класс потока на классах PHP. Должно быть все, в чем Вы нуждаетесь.
Файлы потока являются в основном вложенными словарями, закодированными BEncode. BEncode является простым кодированием и существует несколько классов BDecode PHP, как этот .
Структура файла потока описана в BEP0003.
Примечание, что файлы потока не содержат поле "Seeders", которое Вы упоминаете. Список сеялок является динамичным и управляется сервером средства отслеживания. При наличии потока hash_info
и tracker_url
(оба доступные из файла потока) можно отправить запрос царапанья на средство отслеживания, и это возвратит количество сеялок в 'полном' поле, видеть Конвенция .