如何无填充将两个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
相关产品推荐
相关产品推荐

