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

如何无填充将两个41位Unix毫秒时间戳写入11字节二进制文件

11字节紧凑存储双41位毫秒时间戳实现

问题背景

给定两个Unix毫秒级时间戳1656773855233、1656773888716,要求写入二进制文件后总占用长度为11字节:

  • 限定时间戳表示范围不晚于2039年9月7日时,单时间戳仅需41位即可完整存储
  • 两个41位数值合计占82位,11字节共88位,剩余6位为空闲位
  • 原有逐时间戳转6字节写入的方案会为单值填充7个冗余0位,最终生成12字节文件,不符合长度要求。

原有冗余实现

receive_time=1656773855233
event_time=1656773888716

with open("test.bin", "wb") as f:
    f.write(receive_time.to_bytes(6, "big"))
    f.write(event_time.to_bytes(6, "big"))

print(f"{receive_time:08b}")
print(f"{event_time:08b}")

with open("test.bin", "rb") as f:
    a = f.read()
    print(" ".join(f"{byte:08b}" for byte in a))

勘误说明:原问题曾表述41位数值存储Unix毫秒级时间戳最大可表示2109年5月15日,该结论有误;经指正,41位仅可覆盖约69.7年的时间跨度,最大可表示日期为2039年9月7日,42位数值才可覆盖至2109年5月15日之前的日期。

正确实现方案

核心思路是不单独为每个时间戳做字节对齐填充,先将两个41位时间戳移位拼接为单个88位整数,再统一转换为11字节大端序二进制写入,空闲高位默认填0即可。

写入代码

receive_time = 1656773855233
event_time = 1656773888716
BITS_PER_TIMESTAMP = 41
MAX_41BIT_VAL = (1 << BITS_PER_TIMESTAMP) - 1

# 范围校验,避免数值溢出
if receive_time > MAX_41BIT_VAL or event_time > MAX_41BIT_VAL:
    raise ValueError("时间戳超出41位可表示范围,最大支持日期为2039年9月7日")

# 拼接两个时间戳:第一个时间戳放在高位,左移41位后与第二个时间戳按位或
combined_val = (receive_time << BITS_PER_TIMESTAMP) | event_time

# 转换为11字节大端序写入文件
with open("test.bin", "wb") as f:
    f.write(combined_val.to_bytes(length=11, byteorder="big"))

读取解析代码

with open("test.bin", "rb") as f:
    bin_data = f.read(11)
    combined_val = int.from_bytes(bin_data, byteorder="big")
    # 低41位为第二个时间戳
    parsed_event = combined_val & MAX_41BIT_VAL
    # 右移41位得到高位存储的第一个时间戳
    parsed_receive = combined_val >> BITS_PER_TIMESTAMP

print(parsed_receive, parsed_event)

结果验证

运行代码生成的test.bin文件大小恰好为11字节,对应:

  • 二进制串:0000001100000011011111101101010110010000000000111000000110111111011010110100101011001100
  • 十六进制串:3037ED5900381BF6B4ACC
    与预期结果完全一致。

内容的提问来源于stack exchange,提问作者MadsRC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:39:18