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

如何用Python实现Ruby Array#pack的Git树对象打包功能

解决方案

先明确Ruby Array#pack("Z*H40") 的核心行为:

  • Z*:把输入字符串转为带空字节结尾的C风格字符串(即原字符串内容 + \x00)
  • H40:将40位十六进制字符串解码为20字节的二进制数据(每两个十六进制字符对应1个字节)

Python里不用硬套struct.pack,分两步就能实现等价逻辑,避开格式字符和字节拼接的坑:

实现代码

def pack_tree_entry(mode, filename, oid_hex):
    # 处理模式+空格+文件名+空字节:对应Ruby的Z*部分
    header = f"{mode} {filename}".encode("utf-8") + b"\x00"
    
    # 处理OID:将40位十六进制串转为20字节二进制,对应Ruby的H40部分
    oid_bytes = bytes.fromhex(oid_hex)
    
    # 拼接得到Git树条目二进制串
    return header + oid_bytes

关键说明

  1. Header部分:
    Ruby的Z*会自动给字符串追加终止空字节,Python里我们手动拼接模式、空格、文件名,转成UTF-8字节后加b"\x00",完全等价于Ruby的行为。
  2. OID部分:
    Ruby的H40是十六进制字符串到二进制的解码,Python的bytes.fromhex()直接实现这个功能——别用struct.pack的H格式,它是用来打包无符号短整型的,和这里的十六进制解码逻辑完全无关,这也是你之前格式字符报错的原因。

测试示例

传入模式"100644"、文件名"README.md"、OID十六进制串"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",调用函数后就能生成符合Git树对象规范的二进制数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:22:52