PHP 二进制数据 - 不依赖于机器


PHP binary data - no machine dependent

我在PHP中表示二进制数据时遇到了一点麻烦。我正在开发Web服务器(php)和foxtrot plc机器之间的通信。我正在咬级别进行交流,但我在 php 中找不到适合我所有需求的正确函数......

我正在寻找一种简单的方法来处理二进制数据并将其转换为 usint、sint、uint、int、udint、dint、real、string 等。但是我需要它独立于Web服务器机器-因为重要的部分是plc。

最好看的解决方案是打包/解包功能,但 IAM 缺少一些格式 - 例如有符号的长字节序 - 小端字节序。我需要分隔每个字节。

PLC 是 16 位,因此大小为:圣 - 8 位/整数 - 16 位/丁 - 32 位

// I need something like this
$lib->convertToBytes(65000); // result [0 => 11101000, 1 => 11111101]
$lib->convertToInt([0 => 11101000, 1 => 11111101]); // result 65000
// And this
$lib->convertToBytes(-65000); // result array
$lib->convertToBytes(658.2); // result array
$lib->convertToBytes(-320.8); // result array

我的 Web 服务器是 64 位的,所以如果我调用:

decbin(-65000) // i get "1111111111111111111111111111111111111111111111110000001000011000" (64)
pack('l', -65000) // i get "'x18'x02'xff'xff" (4) - this seems good but i need machine independent representation - little endian byte order in every situation

有谁知道我可以使用的功能/函数/库吗?

感谢

你正在寻找 pack() 函数。 它没有所有类型的有符号/无符号变体,因为它们不是必需的,如文档所述:

"请注意,只有有符号值和无符号值之间的区别 影响函数 unpack(),其中函数 pack() 给出相同的 有符号和无符号格式代码的结果。

要获取单个字节,您可以使用移位和掩码。 这通过将您想要的字节向下移动到低 8 位,然后使用 AND 操作屏蔽您不需要的其他位(将它们设置为零)来工作。

低字节:$val & 0xff;

第二个字节:($val >> 8) & 0xff;

第三个字节:($val >> 16) & 0xff;

要将单个字节转换为整数,请执行相反的操作:

$val = $byte[0] | ($byte[1] << 8) | ($byte[2] << 16) ...

等等。