需求倒是很简单,给一个Hex 格式的string, 对其进行 base32(crockford) 编码,求编码结果。下面是代码,期望结果是 "2HH0GC3SRC6PAYX9Z6WVGKCEK0TEF9QC8K7J8F312QSZYEYP64MN8Y9SXR", 实际得到 "MC8430YE31NJQQAFSQ6W4V3MR6KKTDV24SWJ3RR8NYFZKQNHH55A7JEFE"。
import base32_crockford
from base64 import b16decode
buffer_hex = "1462083079c30d657ba9f9b9b84d8e9834e7a6ec44cf243c6115f3ff3bd63129547939ee"
b = b16decode(buffer_hex.upper())
n = int.from_bytes(b, byteorder="big", signed=False)
result = base32_crockford.encode(n)
print(result) # output: MC8430YE31NJQQAFSQ6W4V3MR6KKTDV24SWJ3RR8NYFZKQNHH55A7JEFE, 与预期不符
因为换了其他语言比如nodejs, 很容易就拿到了期望的结果
package.json:
"base32-decode": "1.0.0",
"base32-encode": "1",
完整代码:
const base32Encode = require('base32-encode')
const buffer_hex = '1462083079c30d657ba9f9b9b84d8e9834e7a6ec44cf243c6115f3ff3bd63129547939ee'
const buf = Buffer.from(buffer_hex, 'hex')
const u8 = new Uint8Array(buf)
const result = base32Encode(u8, 'Crockford')
// output: 2HH0GC3SRC6PAYX9Z6WVGKCEK0TEF9QC8K7J8F312QSZYEYP64MN8Y9SXR, 这是期望的结果
console.log(result)
可以对标这个在线网站的结果
https://cryptii.com/pipes/hex-to-base32
我尝试过修改python 脚本中的 int.from_bytes
的参数,比如字节顺序改成 "little"小端序, singed=True,依然得不到期望结果。
从
n = int.from_bytes(b, byteorder="big", signed=False)
这步开始就不对了,node.js 的实现是 bytes 5 位一组转换并拼接的,而不是直接把一个大数整体转换。重新写了一个,没有第三方依赖: