2015-04-07 207 views
0

我正在使用一个使用自定义TCP协议的项目。除了一件事之外,我已经拥有了一切:协议在信息前需要4次叮咬,这决定了包裹的长度。在的NodeJS,这是通过做:PHP中的字节缓冲区?

var b = new Buffer(4); 
b.writeUInt32BE(data.length, 0); 

但是,有没有在PHP也这样?我正在考虑使用pack() - 但我没有这个功能的经验。我还需要阅读相同格式的包,因此我也需要能够从前4个叮咬中获得整数。

回答

2

使用包是在PHP走正确的路,这里是如何使用它您所需要的信息返回例如:

<?php 

$string = 'hello world'; 
$bytes = pack ('N', strlen ($string)); // unsigned 32 bit big endian byte order 

?> 

为了解析第4个原始字节回了一些,这假定名为$ rawBytes的变量包含从tcp数据包中读取的数据。在PHP

<?php 

$decoded = unpack ('N', substr ($rawBytes, 0, 4);); 
$length = end ($decoded); 

?> 

一个不幸的小问题,就是二进制既懂在Windows计算机和Linux的32位/苹果/ Unix机器的32位有符号整数。在Linux /苹果/ Unix机器上运行

2,147,483,648 2,147,483,647

64位二进制代码PHP有签署64位整数的最大整数值。

-9,223,372,036,854,775,808 9,223,372,036,854,775,807

但在使用64位二进制文​​件在Windows机器上仍然有32位有符号整数的整数大小。

超出整数范围的任何内容都将转换为浮点数。

+0

'pack(“N”,int)'正是我所需要的!感谢这个答案,所有问题都解决了。 :)也感谢周围的解释,今天学到了一些东西。 –