2013-07-29 113 views
0

我从PUSH服务接收数据。该数据使用gzcompress()进行压缩。在数据的最开始,它包含一个int,它是包含的数据的长度。这是在gzcompress()之后完成的;因此,样本数据将是:从字符串获取int位置PHP

187xœËHÍÉÉ, 

这是公司生产的

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

现在,我不知道INT的长度,也可能是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

不知道你的意思在这里'假设在使用'^压缩数据绝不会跟一个digit'开始(之间的分隔符\ 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); 

但我觉得如果第一个压缩字节是一个数字,这可能会失败。