You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP将6字节array-bytes转换为int64格式时间戳

实现方案

你提供的JS代码是标准LEB128 Varint编码的解码逻辑,输入的6字节数组为Varint编码后的64位毫秒时间戳,PHP实现完全对齐JS逻辑的转换代码如下:

function varint6_to_timestamp(array $bytes): int
{
    $lo = 0;
    $hi = 0;
    $pos = 0;
    // 解码低32位部分
    for ($t = 0; $t < 4; $t++) {
        $byte = $bytes[$pos++];
        $lo |= ($byte & 0x7F) << (7 * $t);
        if ($byte < 0x80) {
            goto merge_result;
        }
    }
    // 处理跨高低位的第5个字节
    $byte = $bytes[$pos++];
    $lo |= ($byte & 0x7F) << 28;
    $hi |= ($byte & 0x7F) >> 4;
    if ($byte < 0x80) {
        goto merge_result;
    }
    // 解码高32位剩余部分
    for ($t = 0; $t < 5; $t++) {
        $byte = $bytes[$pos++];
        $hi |= ($byte & 0x7F) << (7 * $t + 3);
        if ($byte < 0x80) {
            break;
        }
    }
    merge_result:
    // 按JS逻辑合并高低位为64位整数
    if ((($hi >> 31) & 1) === 1) {
        // 负数处理逻辑,时间戳场景不会触发
        $t = (1 + ~$lo) & 0xFFFFFFFF;
        $n = (~$hi) & 0xFFFFFFFF;
        if ($t === 0) {
            $n = ($n + 1) & 0xFFFFFFFF;
        }
        return -($t + 4294967296 * $n);
    }
    return $lo + 4294967296 * $hi;
}

测试验证

// 示例1测试
var_dump(varint6_to_timestamp([224, 221, 199, 147, 195, 47])); 
// 输出:int(1632933900000)
// 示例2测试
var_dump(varint6_to_timestamp([224, 143, 228, 137, 198, 47])); 
// 输出:int(1633718700000)

由于Varint是变长编码,没有直接对应的pack/unpack格式符,必须手动按位处理每一个字节,上述实现已经完全匹配你提供的JS代码逻辑,可直接使用。

内容的提问来源于stack exchange,提问作者Martin Zvarík

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:39:02