Bech32编码 原理
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bech32编码 原理相关的知识,希望对你有一定的参考价值。
1. 产生
1.1 ben32编码
字符串最多有 90 个字符长
part1: 人类可读HRP human-readable part,标识数据的类型或某种意义。
. 必须包含 1 到 83 个 US-ASCII 字符,每个字符的值在 [33-126] 范围内。
. HRP 的有效性对于有的应用程序会严格限制。
part2: 分割符,始终是“1”
part3:data数据
- 至少长6个字符
- 只包含字母数字字符(地址中只包含0-9,az)
- 不包括“1”,“B”,“I”,和“o”
1.2 ben32校验
由bech32_verify_checksum函数验证
def bech32_polymod(values):
GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
chk = 1
for v in values:
b = (chk >> 25)
chk = (chk & 0x1ffffff) << 5 ^ v
for i in range(5):
chk ^= GEN[i] if ((b >> i) & 1) else 0
return chk
def bech32_hrp_expand(s):
return [ord(x) >> 5 for x in s] + [0] + [ord(x) & 31 for x in s]
def bech32_verify_checksum(hrp, data):
return bech32_polymod(bech32_hrp_expand(hrp) + data) == 1
- 最多影响 4 个字符的任何错误, 并且未能检测到更多错误的可能性不到 1e9分之一
- 人类可读部分的处理方法是首先将每个字符的 US-ASCII 值的较高位输入校验和计算,然后是零,然后是低位。
def bech32_create_checksum(hrp, data):
values = bech32_hrp_expand(hrp) + data
polymod = bech32_polymod(values + [0,0,0,0,0,0]) ^ 1
return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
2. 纠错
BCH 码的特点之一是它们可用于纠错:将无效输入更改为有效输入
- 副作用:如果犯了多个错误,则有效输入可能不是正确输入。
- 对于演示,小写通常更可取,但在二维码中应该使用大写
以上是关于Bech32编码 原理的主要内容,如果未能解决你的问题,请参考以下文章