2013-07-29 7 views
0

Я получаю данные от службы PUSH. Эти данные сжимаются с помощью gzcompress(). В самом начале данных он содержит int, который является длиной содержащихся данных. Это делается после gzcompress(); Таким образом, выборочные данные будут:Получить int позицию из строки PHP

187xœËHÍÉÉ, 

который продуцируется

echo '187'.gzcompress('Hello'); 

Теперь, я не знаю длину междунар, это может быть 1 цифра это может быть 10 цифр. Я также не знаю первого символа, чтобы найти позицию начала строки.

Любые идеи о том, как извлекать/вычитать int?

$length_value=??? 
$string_value=??? 
+0

Вы можете просто передать его int 'echo (int)" 187xœËHÍÉÉ, ";' или, возможно, использовать регулярное выражение '^ \ d +' – HamZa

ответ

2

Предполагая, что сжатые данные будут NEVER начинаться с цифры, то регулярное выражение будет проще всего:

$string = '187xœËHÍÉÉ,'; 
preg_match('/^(\d+)/', $string, $matches); 
$number = $matches[0]; 
$compressed_data = substr($string, 0, strlen($number)); 

Если сжатые данные ДЕЙСТВИТЕЛЬНО начинаться с цифры, то вы собираетесь в конечном итоге с поврежденными данными - у вас не будет абсолютно никакого способа дифференцирования, где значение «длина» прекращается, и сжатые данные начинаются, например

$compressed = '123foo'; 
$length = '6'; 

$your_string = '6123foo'; 

ОК - это строка длиной 61, со сжатыми данными 23foo? или 612 + 3foo?

+0

Невозможно получить номер, если между номером и данными не существует разделитель – user4035

+0

Не уверен, что вы имеете в виду здесь «Предполагая, что сжатые данные НИКОГДА не начнут с цифры» при использовании '^ (\ d +) '. Обратите внимание, что '^' подразумевает, что цифры находятся в начале. – HamZa

+4

@HamZa: Я рассмотрел это в последнем фрагменте кода. –

0

Вы можете использовать preg_match() поймать целое число в начале строки. http://php.net/manual/en/function.preg-match.php

+1

Ну без фактического шаблона этот ответ бесполезен, не согласны? – HamZa

+0

На самом деле он не попросил пути, я дал ему несколько советов. Конечно, я мог бы использовать регулярное выражение. Возможно, это должен был быть комментарий – Jonnny

0

Вы можете сделать:

$contents = "187xœËHÍÉÉ,"; 
$length = (int)$contents; 
$startingPosition = strlen((string)$length); 
$original = gzuncompress(substr($contents, $startingPosition), $length); 

Но я чувствую, что это может не сработать, если первый сжатый байт представляет собой число.

Смежные вопросы