我正在从 /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/