为何base58("foobar")的结果不等于base58("foo")与base58("bar")的拼接?
问题解析:相同Buffer内容为何Base58编码结果不同
先看你贴的代码:
import { encode } from "bs58" const foobar = Buffer.from("foobar") console.log(foobar, encode(foobar)) // <Buffer 66 6f 6f 62 61 72> t1Zv2yaZ const foo = Buffer.from("foo") const bar = Buffer.from("bar") console.log(Buffer.concat([foo, bar]), `${encode(foo)}${encode(bar)}`) // <Buffer 66 6f 6f 62 61 72> bQbpa3cM
核心原因是操作顺序完全不同:
- 第一段代码是先把"foobar"转成完整的字节序列,再对整个字节序列做Base58编码。
- 第二段代码是先分别对"foo"和"bar"的字节序列做Base58编码,得到两个字符串后再拼接起来。
Base58编码的本质是把一段字节数据转换成对应的Base58字符序列,它是对整个字节块的转换,不是对分段编码结果的字符串拼接。举个具体的例子:
- "foo"的字节是
0x66 0x6f 0x6f,Base58编码后是bQbp; - "bar"的字节是
0x62 0x61 0x72,Base58编码后是a3cM; - 把这两个编码后的字符串拼接,得到的是
bQbpa3cM,这和直接对0x66 0x6f 0x6f 0x62 0x61 0x72这个完整字节序列做Base58编码的结果t1Zv2yaZ完全不是一回事——因为字符串拼接的是两个独立编码后的字符,而不是把字节拼接后再编码。
简单说:先拼接字节再编码 ≠ 先编码再拼接字符串,这两种操作的逻辑完全不同,结果自然不一样。
内容的提问来源于stack exchange,提问作者sunknudsen
相关产品推荐
相关产品推荐

