php - 如何在PHP中分割二进制数据并将其转换为数字?

标签 php struct binary unpack

我正在从 /dev/input/ 读取键盘事件。这些是input_event structs ,分别为 5 个数字,采用小端格式,为 24 字节。

这是我当前的解决方案:

$hex = bin2hex(fread($dev, 24));
$time = floatval(unpack("Q", (pack('H*', substr($hex, 0, 16))))[1].".".unpack("Q", (pack('H*', substr($hex, 16, 16))))[1]);
$type = intval(unpack("S", (pack('H*', substr($hex, 32, 4))))[1]);
$code = intval(unpack("S", (pack('H*', substr($hex, 36, 4))))[1]);
$value = intval(unpack("l", (pack('H*', substr($hex, 40, 8))))[1]);

在 PHP 中必须有一种更有效的方法来做到这一点。任何人?布勒?

更新:

一个示例 blob 是:

$raw = hex2bin("f478cd5d0000000026680d000000000001002e0001000000");

这会导致:

$time = 1573746932.8786;
$type = 1;
$code = 46;
$value = 1;

实际结构如下:

struct input_event {
    timeval time;
    __u16 type;
    __u16 code;
    __s32 value;
};

其中 timeval 是:

struct timeval {
    __u64 sec;
    __u64 usec;
}

最佳答案

您可以将其解压为单个值。

<?php
$raw = fread($dev, 24);
$data = unpack("Ptime1/Ptime2/vtype/vcode/Vvalue", $raw);
print_r($data);

输出:

Array
(
    [time1] => 1573746932
    [time2] => 878630
    [type] => 1
    [code] => 46
    [value] => 1
)

关于php - 如何在PHP中分割二进制数据并将其转换为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860764/

相关文章:

php - 将行添加到 WooCommerce 3.6 中的单个产品附加信息表

c++ - 如何使函数保存对 C++ 中结构输入的修改?

go - 使用值创建结构实例

具有二进制数据的 WCF 服务

java - 如何用Java将二进制写入文件

php - Zencoder API PHP 缩略图

php - 使用 session 变量作为测试参数

php - MySQL 为请求的每个字段返回 2 个值

c# - 为什么需要调用:this() on a struct to use automatic properties in c#?

math - 二进制文件中的熵 - 目的是什么?