Multibase

Swift Package Manager compatible Build & Test (macos and linux)

使用 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

API

/// 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.