如何使用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
相关产品推荐
相关产品推荐

