Python中二进制数据到日期时间戳的定制化转换方法

Python中二进制数据到日期时间戳的定制化转换方法

本文旨在探讨如何将特定格式的二进制数据转换为python中的日期时间戳。面对非标准编码的二进制时间戳,我们将通过深入分析数据模式,识别关键字节,并运用字节反转、位移操作以及固定偏移量来计算时间戳。同时,文章强调了时区处理的重要性,特别是结合`pandas.timestamp`来确保转换的准确性,为处理类似定制化二进制时间数据提供了实用的解决方案。

在数据处理领域,将二进制数据转换为可读的日期时间格式是一项常见任务。然而,当面对非标准或定制化的二进制时间戳时,传统的struct模块或datetime库可能无法直接适用。本文将详细介绍一种通过逆向工程和模式识别,将特定格式的9字节二进制数据转换为Python日期时间戳的方法。

1. 二进制数据模式分析

我们首先观察给定的一组二进制数据样本及其对应的日期时间戳,以揭示其内部编码规律。以下是部分示例数据:

# 格式: 十六进制字节序列 : 对应日期时间'30 65 1a eb e3 f2 96 c5 41' : 16 December 2023 at 15:03'30 c6 36 85 70 8a 97 c5 41' : 17 December 2023 at 12:37'30 4a 26 1b 6b 29 74 c4 41' : 1 October 2022 at 12:49'30 23 84 b1 a8 b5 97 c5 41' : 17 December 2023 at 18:45

通过仔细比对这些样本,我们可以发现几个关键模式:

固定首尾字节: 所有样本都以30开头,以41结尾。这表明这些字节可能是数据的起始和结束标记,不包含实际的时间信息。中间字节变化: 实际的时间信息可能编码在中间的7个字节中。局部关联性: 观察16 December和17 December的数据,可以发现倒数第三个字节从96变为97,而倒数第二个字节c5保持不变。这暗示了数据可能采用某种反向或特定顺序的编码。

基于这些观察,我们推测核心时间数据位于第二个字节到倒数第二个字节之间,并且可能需要反转字节顺序进行解析。

立即学习“Python免费学习笔记(深入)”;

2. 核心转换逻辑构建

为了将这些中间字节转换为可用的时间戳,我们需要执行一系列操作:

2.1 数据提取与字节反转

首先,我们需要从完整的9字节序列中提取出中间的7个字节,并将它们反转。这是因为在某些数据编码中,低位字节可能存储在高地址,或数据以小端序(Little-endian)方式存储。

def extract_and_reverse_bytes(hex_string):    """    从十六进制字符串中提取中间字节并反转其顺序。    例如:'30 65 1a eb e3 f2 96 c5 41' -> 'c5 96 f2 e3 eb 1a 65'    """    # 将十六进制字符串分割成字节列表    bytes_list = hex_string.split()    # 提取中间的7个字节 (排除第一个和最后一个)    middle_bytes = bytes_list[1:-1]    # 反转字节顺序    reversed_middle_bytes = middle_bytes[::-1]    # 将反转后的字节拼接成一个十六进制字符串    return ''.join(reversed_middle_bytes)# 示例hex_data = '30 65 1a eb e3 f2 96 c5 41'reversed_hex_str = extract_and_reverse_bytes(hex_data)print(f"反转后的十六进制字符串: {reversed_hex_str}") # 输出: c596f2e3eb1a65

接下来,我们将这个反转后的十六进制字符串转换为一个十进制整数。

# 转换为十进制整数integer_value = int(reversed_hex_str, 16)print(f"对应的十进制整数: {integer_value}") # 输出: 56254701252033061

2.2 位移操作与时间映射

通过分析不同时间戳之间二进制值的变化,我们发现时间差异与一个特定常数(2 ** 23,即8_388_608)的倍数紧密相关。这强烈暗示需要进行位移操作来将原始编码值映射到更接近Unix时间戳(自Epoch以来的秒数)的范围。

因此,我们将上述得到的十进制整数右移23位 (>> 23)。

shifted_value = integer_value >> 23print(f"位移后的值: {shifted_value}") # 输出: 6694802

2.3 应用时间偏移量

位移后的值虽然与时间戳有了关联,但通常还需要一个固定的偏移量来将其精确地对齐到Unix时间戳(通常是自1970年1月1日00:00:00 UTC以来的秒数)。这个偏移量是一个经验值,通过比较已知的时间戳和计算结果来确定。

# 确定的偏移量OFFSET = 4927272860final_seconds = shifted_value - OFFSETprint(f"最终的秒数(近似Unix时间戳): {final_seconds}") # 输出: 1702735142

将上述步骤整合到一个函数中:

def get_approx_epoch_seconds(hex_string):    """    将定制化二进制十六进制字符串转换为近似的Unix时间戳(秒)。    """    # 1. 提取中间字节并反转    bytes_list = hex_string.split()    middle_bytes_reversed_str = ''.join(bytes_list[1:-1][::-1])    # 2. 转换为整数并进行位移    integer_value = int(middle_bytes_reversed_str, 16)    shifted_value = integer_value >> 23    # 3. 应用偏移量    OFFSET = 4927272860    return shifted_value - OFFSET# 示例hex_data_1 = '30 65 1a eb e3 f2 96 c5 41' # 16 December 2023 at 15:03epoch_seconds_1 = get_approx_epoch_seconds(hex_data_1)print(f"'{hex_data_1}' 对应的近似Unix秒数: {epoch_seconds_1}")

3. 时区处理与 pandas.Timestamp 应用

在将秒数转换为日期时间对象时,时区处理是至关重要的,尤其是在存在夏令时(DST)的地区。例如,夏令时转换可能导致1小时(3600秒)的误差。pandas.Timestamp提供了强大的时区处理功能,能够方便地将Unix时间戳转换为带有特定时区信息的日期时间对象。

我们将使用pandas库来处理时间戳转换,并指定一个合适的时区(例如,Europe/Zurich)。

import pandas as pddef to_datetime_with_timezone(hex_string, tz):    """    将定制化二进制十六进制字符串转换为指定时区的pandas.Timestamp对象。    """    # 获取近似的Unix时间戳(秒)    epoch_seconds = get_approx_epoch_seconds(hex_string)    # pandas.Timestamp 接受纳秒级的时间戳,所以乘以 1e9    return pd.Timestamp(epoch_seconds * 1e9, tz=tz)# 定义时区timezone = 'Europe/Zurich'# 完整的示例数据及其对应的标准时间examples = {    '30 65 1a eb e3 f2 96 c5 41': '16 December 2023 at 15:03',    '30 c6 36 85 70 8a 97 c5 41': '17 December 2023 at 12:37',    '30 4a 26 1b 6b 29 74 c4 41': '1 October 2022 at 12:49',    '30 23 84 b1 a8 b5 97 c5 41': '17 December 2023 at 18:45',    '30 3f 91 e7 96 b5 97 c5 41': '17 December 2023 at 18:45:30',    '30 a6 d6 2f d1 b5 97 c5 41': '17 December 2023 at 18:46',    '30 e8 16 9c b9 b5 97 c5 41': '17 December 2023 at 18:47',}# 将示例数据转换为带有时区的pandas.Timestamp对象,并按时间排序examples_processed = dict(sorted([    (k, pd.Timestamp(v, tz=timezone)) for k, v in examples.items()], key=lambda item: item[1]))# 验证转换结果fmt = '%Y-%m-%d %H:%M:%S %Z' # 定义输出时间格式test_results = []for hex_str, expected_time in examples_processed.items():    estimated_time = to_datetime_with_timezone(hex_str, tz=timezone)    time_difference_seconds = (estimated_time - expected_time).total_seconds()    test_results.append((        f'{expected_time:{fmt}}',      # 预期时间        f'{estimated_time:{fmt}}',     # 估计时间        time_difference_seconds        # 差异秒数    ))print("n--- 转换结果与差异 ---")for res in test_results:    print(f"预期: {res[0]}, 估计: {res[1]}, 差异: {res[2]} 秒")

输出结果示例:

--- 转换结果与差异 ---预期: 2022-10-01 12:49:00 CEST, 估计: 2022-10-01 12:49:30 CEST, 差异: 30.0 秒预期: 2023-12-16 15:03:00 CET, 估计: 2023-12-16 15:03:23 CET, 差异: 23.0 秒预期: 2023-12-17 12:37:00 CET, 估计: 2023-12-17 12:36:37 CET, 差异: -23.0 秒预期: 2023-12-17 18:45:00 CET, 估计: 2023-12-17 18:45:25 CET, 差异: 25.0 秒预期: 2023-12-17 18:45:30 CET, 估计: 2023-12-17 18:44:49 CET, 差异: -41.0 秒预期: 2023-12-17 18:46:00 CET, 估计: 2023-12-17 18:46:46 CET, 差异: 46.0 秒预期: 2023-12-17 18:47:00 CET, 估计: 2023-12-17 18:45:59 CET, 差异: -61.0 秒

从结果可以看出,通过这种定制化的转换方法,我们能够将二进制数据大致转换为正确的日期时间戳,误差通常在几十秒的范围内。

4. 注意事项与优化

经验性常数: 本文中的位移量(>> 23)和偏移量(- 4927272860)是基于现有样本数据通过观察和逆向工程得到的经验值。这些常数可能需要根据更大量或更广泛范围的数据进行微调,以达到更高的精度。数据源依赖性: 这种方法高度依赖于特定二进制数据的编码模式。它不是一个通用的解决方案,只适用于与本示例中数据格式相似的场景。时区选择: 选择正确的时区对于处理夏令时和确保时间准确性至关重要。如果数据源位于不同时区,应相应调整tz参数。精度限制: 即使经过优化,由于原始编码的特性,可能仍然存在一些无法完全消除的微小误差。如果需要毫秒甚至更高级别的精度,可能需要更深入地分析原始二进制编码的细节。

5. 总结

将非标准二进制数据转换为日期时间戳是一个挑战,但通过细致的数据模式分析、逆向工程和适当的编程技巧,可以有效地解决。本文介绍的方法通过识别固定字节、反转核心数据字节、应用位移操作和经验性偏移量,成功地将特定格式的二进制数据映射到近似的Unix时间戳。结合pandas.Timestamp进行时区处理,进一步提高了转换的实用性和准确性。在实际应用中,建议根据具体数据源的特点,对关键常数进行调优,以达到最佳的转换效果。

以上就是Python中二进制数据到日期时间戳的定制化转换方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1377995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python列表高效初始化:常量填充与动态生成实践指南
上一篇 2025年12月14日 18:15:30
Python教程:高效计算文本文件中指定列的最后N个值的和与平均值
下一篇 2025年12月14日 18:15:46

相关推荐

  • win10便签数据怎么备份_win10便签数据备份与恢复方法

    首先关闭便笺应用,通过文件资源管理器或运行命令进入%LocalAppData%PackagesMicrosoft.MicrosoftStickyNotes_8wekyb3d8bbweLocalState路径,复制Plum.sqlite文件进行备份;恢复时替换该文件即可还原数据。 如果您需要在重装系统…

    2026年8月30日
    100
  • 【Briefings in Bioinformatics】四篇好文简读-专题21

    【Briefings in Bioinformatics】四篇好文简读-专题21【Briefings in Bioinformatics】四篇好文简读-专题21【Briefings in Bioinformatics】四篇好文简读-专题21【Briefings in Bioinformatics】四篇好文简读-专题21

    一 论文题目: SMNN: 通过监督互最近邻检测对单细胞RNA-seq数据进行批次效应校正 论文摘要: 在整合来自不同批次的单细胞RNA测序(scRNA-seq)数据时,批次效应校正被视为一项必要的工作。现有的先进方法通常忽略了单细胞聚类标签信息,但这些信息实际上可以提升批次效应校正的效果,特别是在…

    2026年8月30日 用户投稿
    200
  • 手机淘宝红包页面在哪里?手机淘宝红包页面在哪里打开

    首先打开淘宝App,点击右下角【我的淘宝】进入【红包卡券】查看;或从首页活动入口参与领红包并跳转管理页面;还可通过【专属客服】领取超级红包;大促期间可用口令搜索直达活动页。 如果您在使用淘宝购物时,想要查看或领取平台及商家发放的红包,但不确定入口位置,可能会错过优惠。以下是查找和打开手机淘宝红包页面…

    2026年8月30日
    200
  • win8桌面图标不见了怎么恢复_win8桌面图标丢失找回方法

    桌面图标消失可先检查显示设置并重启资源管理器,若无效则清除图标缓存、运行SFC扫描修复系统文件,并进行全盘杀毒以排除恶意软件影响。 如果您发现Windows 8系统的桌面图标突然消失,这可能是由于设置被更改、资源管理器故障或系统缓存问题导致。以下是几种有效的恢复方法。 本文运行环境:联想ThinkP…

    2026年8月30日
    200
  • 爱奇艺视频怎么下载到本地相册

    首先,启动爱奇艺App并登录个人账户。浏览至你想保存的视频内容,进入其播放界面。在播放页面中,通常会显示一个下载按钮,一般为向下箭头图标。 点击该图标后,系统将跳转至下载选项页面。在此你可以根据需求选择视频的画质,如标清、高清或更高清晰度,建议结合当前网络速度与设备存储容量进行选择。 确认画质后,点…

    2026年8月30日
    000
  • 抖音精选特效怎么用_抖音精选热门视频特效制作教程

    抖音精选特效怎么用_抖音精选热门视频特效制作教程抖音精选特效怎么用_抖音精选热门视频特效制作教程抖音精选特效怎么用_抖音精选热门视频特效制作教程抖音精选特效怎么用_抖音精选热门视频特效制作教程

    首先检查抖音是否为最新版本并更新,其次清除缓存、重启应用,确保相机与麦克风权限已开启;最后可通过剪映使用画中画与关键帧模拟热门特效,或在抖音内使用AI工具上传照片生成特效视频。 如果您在抖音拍摄视频时发现精选特效无法正常使用或想要了解如何制作热门的特效内容,可能是由于特效加载失败、权限设置不当或操作…

    2026年8月30日 用户投稿
    200
  • MySQL存储过程调试流程详解_Sublime插件支持语法结构高亮检查

    MySQL存储过程调试流程详解_Sublime插件支持语法结构高亮检查MySQL存储过程调试流程详解_Sublime插件支持语法结构高亮检查MySQL存储过程调试流程详解_Sublime插件支持语法结构高亮检查MySQL存储过程调试流程详解_Sublime插件支持语法结构高亮检查

    mysql存储过程调试困难,核心解决策略包括:1.利用select语句输出变量值;2.写入日志表记录执行状态;3.使用signal抛出错误中断流程;4.sublime text辅助代码检查。由于mysql缺乏原生调试器,通常通过运行时输出信息观察程序状态,如在关键逻辑插入select查看变量、将调试…

    2026年8月30日 用户投稿
    000
  • 如何为iPhone14Pro获取固件包?安全下载完整指南

    首先通过苹果开发者网站下载固件包,确保来源安全;其次可使用ipsw.me等可信第三方平台查找并验证校验码;最后可通过爱思助手或iMazing等管理工具自动匹配并下载对应IPSW文件。 如果您尝试为您的iPhone 14 Pro获取固件包,但无法找到可靠来源或担心下载到被篡改的文件,则可能是由于未使用…

    2026年8月30日
    000
  • 微博发视频为什么会被压缩_微博视频压缩原因解析

    微博压缩视频以节省带宽与存储,适配多设备播放并优化弱网传输,同时满足审核需求。原始视频被转码为H.264、1080p或720p、30fps标准格式,比特率限制在8Mbps内,音频降采样,高帧率与宽高比信息丢失,且嵌入水印影响画质。 如果您在微博上传视频后发现画质明显下降,可能是由于平台对视频进行了自…

    2026年8月30日
    000
  • 拼多多双11优惠券规则是什么?拼多多双11优惠券怎么用

    拼多多双11优惠券可通过搜索“ddd”抢券、参与三单挑战、每日签到、砸金蛋及开宝箱等方式获取,主要类型包括平台通用券、大牌专属券和跨店满减券,其中跨店满减为每满300减50,支持多店商品合并使用,优惠券可与百亿补贴叠加,且需在有效期内一次性结算使用,部分券种与店铺活动互斥。 如果您在拼多多双11大促…

    2026年8月30日
    000
  • 天猫小二怎么介入?天猫小二怎么介入店铺

    买家或卖家在无法协商解决纠纷时,可申请天猫小二介入。买家通过订单页面提交退款争议并上传凭证,进入3天举证期后由平台裁决;卖家可在遭遇异常订单时,通过商家中心提交介入申请并提供证据;针对非交易问题,可通过千牛工作台联系人工客服,转接对应小二处理运营事项。 如果您在处理天猫平台的交易纠纷或店铺运营问题时…

    2026年8月30日
    000
  • mac重启能清除缓存吗

    重启Mac能清除内存中的活跃缓存和临时文件,释放系统资源,使运行更流畅,但无法清除硬盘上的应用缓存、浏览器缓存等持久化数据,需通过手动清理或工具处理。 Mac重启确实能清除一部分缓存,但并非所有缓存都能被彻底清除。它主要能清空内存(RAM)中的活动缓存,以及一些系统级的临时文件和日志,从而释放资源,…

    2026年8月30日
    000
  • 抖音怎么解除青少年模式_抖音青少年模式关闭方法

    首先通过设置页面输入密码关闭青少年模式,若忘记密码可使用申诉重置功能并提交身份证明,最后仍无法解决则联系官方客服进行人工解除。 如果您尝试在抖音中解除青少年模式,但发现无法直接关闭,则可能是由于该账号设置了密码保护或存在其他限制。以下是几种有效的解除方法: 本文运行环境:iPhone 15 Pro,…

    2026年8月30日
    200
  • CodeIgniter 4 库实例共享与内存效率提升实践

    本文探讨了在CodeIgniter 4中,如何通过利用框架的服务层来优化多功能库的内存使用。针对那些执行数据处理、内容过滤或表单计算等广泛任务的库,我们介绍了如何使用共享实例模式,避免不必要的对象实例化,从而显著降低内存消耗并提升应用性能。 在codeigniter 4的开发实践中,开发者经常会创建…

    2026年8月30日
    000
  • perplexity安装详解-怎么安装perplexity的实用教程

    首先通过官方渠道下载并正确安装Perplexity,若无法使用可检查权限设置;其次可通过Chrome扩展或App Store在桌面端和移动端安装,确保账号登录后即可正常使用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您尝试在设备上…

    2026年8月30日
    100
  • 手机淘宝怎么转让店铺?手机淘宝怎么转让店铺会员

    淘宝店铺无法直接转让,需通过千牛卖家中心申请主体变更并经平台审核;个体户可办理过户,须提交身份及亲属关系证明;会员权益依附原店,变更后可能重置,需提前公告并导出客户数据。 如果您希望将名下的淘宝店铺或店铺会员权益进行转让,由于淘宝平台对账户及店铺的管理有严格规定,需按照官方允许的方式操作。以下是相关…

    2026年8月30日
    100
  • B站在线免费进入网站入口长期免费

    B站官网www.bilibili.com是免费观看视频的正规渠道,用户可在线浏览大量UGC内容、部分免费动漫影视及直播;普通用户能免费观看多数视频,部分番剧提供试看集,平台不定期推出限时免费活动;应避免点击非官方“免VIP”链接,以防信息泄露或盗版风险;移动端建议通过应用商店下载官方App,支持离线…

    2026年8月30日
    300
  • 番茄小说怎么删除我的评论和回复_番茄小说删除我的评论和回复教程

    答案:可通过番茄小说App或网页端删除评论及回复。1、在App中进入“我的”-“我的评论”,左滑删除评论;2、点击评论进入详情,长按回复并选择删除;3、网页端登录后进入“我的互动”,点击删除图标确认操作。 如果您在番茄小说中发表了评论或回复,但希望将其删除以维护个人隐私或修改内容,可以通过以下方法进…

    2026年8月30日
    000
  • 手机淘宝怎么设置简洁?手机淘宝怎么设置简洁密码

    1、可通过关闭个性化推荐实现淘宝简洁界面;2、在账户与安全中修改为字母+数字组合的登录密码以兼顾安全与记忆;3、启用人脸、指纹或手势登录提升便捷性。 如果您觉得手机淘宝界面过于复杂,想要调整为更简洁的模式,或希望设置一个简单易记但安全的密码,可以通过以下方法进行操作。这些步骤将帮助您优化应用界面和账…

    2026年8月30日
    000
  • 在手机淘宝怎么退款申请?手机淘宝上如何退款申请

    未收到货可申请仅退款,进入订单详情提交退款申请并选择“我要退款(无需退货)”,填写原因后等待商家处理或系统自动退款;已收到货需退货退款时,选择“我要退货退款”,上传凭证,商家审核通过后按要求寄回商品;符合条件的订单可使用上门取件服务,预约时间后快递员上门收件,填写运单号完成退货流程。 如果您在手机淘…

    2026年8月30日
    000

发表回复

登录后才能评论
关注微信