refactor: 提取公共 bytes_to_hex/nibble_to_hex_char,消除三处重复的 SHA1 hex 转换
This commit is contained in:
1 parent
a6510bbf31
commit
989e898a93
3 files changed
+51
-42
No files matched your search
@@ -19,6 +19,50 @@ import w32.win32base
|
||||
_mbuddy: memhub.MemBuddy | t.CPtr
|
||||
|
||||
|
||||
# ============================================================
|
||||
# nibble_to_hex_char - 半字节转十六进制字符
|
||||
# ============================================================
|
||||
def nibble_to_hex_char(n: int, uppercase: int) -> t.CChar:
|
||||
"""0-15 → '0'-'9'/'a'-'f'(uppercase=1 时用 'A'-'F')"""
|
||||
if n < 10:
|
||||
return '0' + n
|
||||
if uppercase != 0:
|
||||
return 'A' + (n - 10)
|
||||
return 'a' + (n - 10)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# bytes_to_hex - 字节序列转十六进制字符串
|
||||
# ============================================================
|
||||
def bytes_to_hex(pool: memhub.MemBuddy | t.CPtr,
|
||||
digest: bytes,
|
||||
nbytes: t.CSizeT,
|
||||
uppercase: int,
|
||||
use_malloc: int) -> str:
|
||||
"""将 digest 前 nbytes 字节转为 2*nbytes 个十六进制字符(含 null 终止)
|
||||
|
||||
use_malloc=1 时用 stdlib.malloc(调用方负责 free),否则 pool.alloc。
|
||||
合并自 Utils.compute_sha1 / IncludesScanner.compute_file_sha1 的重复 hex 转换。
|
||||
"""
|
||||
if digest is None or nbytes <= 0:
|
||||
return None
|
||||
hex_len: t.CSizeT = nbytes * 2 + 1
|
||||
hex_buf: str = None
|
||||
if use_malloc != 0:
|
||||
hex_buf = stdlib.malloc(hex_len)
|
||||
else:
|
||||
hex_buf = pool.alloc(hex_len)
|
||||
if hex_buf is None:
|
||||
return None
|
||||
for i in range(nbytes):
|
||||
hi: int = (digest[i] >> 4) & 0xF
|
||||
lo: int = digest[i] & 0xF
|
||||
hex_buf[i * 2] = nibble_to_hex_char(hi, uppercase)
|
||||
hex_buf[i * 2 + 1] = nibble_to_hex_char(lo, uppercase)
|
||||
hex_buf[nbytes * 2] = '\0'
|
||||
return hex_buf
|
||||
|
||||
|
||||
# ============================================================
|
||||
# compute_sha1 - 计算字符串的 SHA1,返回前 16 个十六进制字符
|
||||
#
|
||||
@@ -44,22 +88,7 @@ def compute_sha1(pool: memhub.MemBuddy | t.CPtr, content: str) -> str:
|
||||
ctx.final(digest)
|
||||
|
||||
# 转为十六进制字符串(取前 8 字节 = 16 个十六进制字符)
|
||||
hex_buf: str = pool.alloc(17)
|
||||
if hex_buf is None:
|
||||
return None
|
||||
for i in range(8):
|
||||
hi: int = (digest[i] >> 4) & 0xF
|
||||
lo: int = digest[i] & 0xF
|
||||
if hi < 10:
|
||||
hex_buf[i * 2] = '0' + hi
|
||||
else:
|
||||
hex_buf[i * 2] = 'a' + (hi - 10)
|
||||
if lo < 10:
|
||||
hex_buf[i * 2 + 1] = '0' + lo
|
||||
else:
|
||||
hex_buf[i * 2 + 1] = 'a' + (lo - 10)
|
||||
hex_buf[16] = '\0'
|
||||
return hex_buf
|
||||
return bytes_to_hex(pool, digest, 8, 0, 0)
|
||||
|
||||
|
||||
# ============================================================
|
||||
|
||||
@@ -22,6 +22,7 @@ import lib.core.Handles.HandlesImports as HandlesImports
|
||||
import lib.core.StubMerger as StubMerger
|
||||
import lib.core.VLogger as VLogger
|
||||
import lib.Projectrans.Config as Config
|
||||
import lib.Projectrans.Utils as Utils
|
||||
|
||||
|
||||
# ============================================================
|
||||
@@ -75,15 +76,9 @@ def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr,
|
||||
pos += 1
|
||||
hi: int = (ch >> 4) & 0xF
|
||||
lo: int = ch & 0xF
|
||||
if hi < 10:
|
||||
buf[pos] = '0' + hi
|
||||
else:
|
||||
buf[pos] = 'A' + (hi - 10)
|
||||
buf[pos] = Utils.nibble_to_hex_char(hi, 1)
|
||||
pos += 1
|
||||
if lo < 10:
|
||||
buf[pos] = '0' + lo
|
||||
else:
|
||||
buf[pos] = 'A' + (lo - 10)
|
||||
buf[pos] = Utils.nibble_to_hex_char(lo, 1)
|
||||
pos += 1
|
||||
else:
|
||||
buf[pos] = ch
|
||||
|
||||
@@ -9,6 +9,7 @@ import w32.win32base as win32base
|
||||
import w32.fileio as fileio
|
||||
import hashlib
|
||||
import viperlib
|
||||
import lib.Projectrans.Utils as Utils
|
||||
import lib.core.VLogger as VLogger
|
||||
|
||||
|
||||
@@ -201,24 +202,8 @@ def compute_file_sha1(pool: memhub.MemBuddy | t.CPtr,
|
||||
return None
|
||||
ctx.final(digest)
|
||||
|
||||
# 转为十六进制字符串(取前 8 字节 = 16 个十六进制字符)
|
||||
hex_buf: str = stdlib.malloc(17)
|
||||
if hex_buf is None:
|
||||
stdlib.free(buf)
|
||||
stdlib.free(digest)
|
||||
return None
|
||||
for i in range(8):
|
||||
hi: int = (digest[i] >> 4) & 0xF
|
||||
lo: int = digest[i] & 0xF
|
||||
if hi < 10:
|
||||
hex_buf[i * 2] = '0' + hi
|
||||
else:
|
||||
hex_buf[i * 2] = 'a' + (hi - 10)
|
||||
if lo < 10:
|
||||
hex_buf[i * 2 + 1] = '0' + lo
|
||||
else:
|
||||
hex_buf[i * 2 + 1] = 'a' + (lo - 10)
|
||||
hex_buf[16] = '\0'
|
||||
# 转为十六进制字符串(取前 8 字节 = 16 个十六进制字符,stdlib 分配保持原行为)
|
||||
hex_buf: str = Utils.bytes_to_hex(pool, digest, 8, 0, 1)
|
||||
stdlib.free(buf)
|
||||
stdlib.free(digest)
|
||||
return hex_buf
|
||||
|
||||
Reference in new issue
Block a user