使用 Multibase 规范的自识别 Base 编码
Multibase 是一种协议,用于消除文本中出现的 base 编码(例如,base32、base36、base64、base58 等)二进制编码的歧义。
当文本被编码为字节时,我们通常可以使用通用的编码(UTF-8),因为我们总是编码到相同的 256 字节集(+/- NUL 字节)。当这不起作用时,通常出于历史或性能原因,我们通常可以从上下文中推断出编码。
然而,当字节被编码为文本(使用 base 编码)时,base 编码的 base 选择通常受上下文限制。更糟糕的是,这些限制可能会根据数据在文本中出现的位置而改变。在某些情况下,我们只能使用 [a-z0-9]
。在其他情况下,我们可以使用更大的字符集,但需要紧凑的编码。这导致了大量的“base 编码”,每种用例都有一种。与将文本编码为字节不同,我们不能仅仅围绕单一的 base 编码进行标准化,因为没有适用于所有情况的最佳编码。
不幸的是,什么 base 编码被使用并不总是清楚;这就是 multibase 的用武之地。它回答了这个问题
给定编码为文本 s 的数据 d,它使用什么 base 编码?
在您的 Package.swift 文件中包含以下依赖项
let package = Package(
...
dependencies: [
...
.package(url: "https://github.com/swift-libp2p/swift-multibase.git", .upToNextMajor(from: "0.0.1"))
],
...
targets: [
.target(
...
dependencies: [
...
.product(name: "Multibase", package: "swift-multibase"),
]),
]
...
)
import Multibase
/// The Multibase format is:
/// <base-encoding-character><base-encoded-data>
/// Where `<base-encoding-character>` is used according to the multibase table.
// To Encode a human readable string into a certain base encoding...
"Decentralize Everything!!".encode(as: .base8) // -> "72106254331267164344605543227514510062566312711713506415133463441102" -- Note the '7' multibase prefix tag
"Decentralize Everything!!".encode(as: .base64) // -> "mRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ" -- Note the 'm' multibase prefix tag
// To Decode a Multibase encoded string (one that has the proper base prefix prepended)...
try BaseEncoding.decodeIntoString("72106254331267164344605543227514510062566312711713506415133463441102") // -> (base: .base8, string: "Decentralize Everything!!")
try BaseEncoding.decodeIntoString("mRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchIQ") // -> (base: .base64, string: "Decentralize Everything!!")
/// String/Data/[UInt8] extensions (NOTE: all extensions default to no Multibase prefix!)
"Hello World".data(using: .utf8)!.asString(base: .base16) // -> 48656c6c6f20576f726c64
"Hello World".data(using: .utf8)!.asString(base: .base16, withMultibasePrefix: true) // -> f48656c6c6f20576f726c64
/// BaseEncoding Enum
let multibase = try! BaseEncoding.decodeIntoString("t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e891")
multibase2.base // -> .base32HexPad
multibase2.string // -> "Decentralize everything!!"
/// String Extensions
String(decoding:String, as:BaseEncoding, using:String.Encoding = .utf8) throws
String.baseEncoding -> BaseEncoding
String.encode(as: BaseEncoding, using:String.Encoding = .ascii) -> String
/// Data Extensions
Data.init(decoding:String, as:BaseEncoding) throws
Data.asString(base:BaseEncoding, withMultibasePrefix:Bool = false) -> String
/// Array<UInt8> Extensions
Array<UInt8>(decoding:String, as:BaseEncoding) throws
Array<UInt8>.asString(base:BaseEncoding, withMultibasePrefix:Bool = false) -> String
欢迎贡献!这段代码很大程度上是一个概念验证。我可以保证您有更好/更安全的方法来实现相同的结果。欢迎任何建议、改进,甚至只是批评!
让我们一起让这段代码变得更好!🤝
MIT © 2022 Breth Inc.