SwiftBases

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

SwiftBases 是一个集合,包含用于各种常见进制的编码和解码算法。

目录

概述

这个库旨在支持 Multibase 包。目前它支持编码/解码为 base 2、8、10、16、32、36、58 和 64,以及某些进制的常见变体。

注意‼️

更多详情请参阅

安装

在您的 Package.swift 文件中包含以下依赖项

let package = Package(
    ...
    dependencies: [
        ...
        .package(url: "https://github.com/swift-libp2p/swift-bases.git", .upToNextMajor(from: "0.0.1"))
    ],
    ...
    targets: [
        .target(
            ...
            dependencies: [
                .product(name:  "Base2", package: "swift-bases"),
                .product(name:  "Base8", package: "swift-bases"),
                .product(name:  "BaseX", package: "swift-bases"),
                .product(name: "Base32", package: "swift-bases"),
                .product(name: "Base64", package: "swift-bases")
            ]),
    ]
    ...
)

用法

示例

import Base2

let binaryEncoded = "Hello World".binaryEncoded(using: .utf8, spacing: true) // -> "01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100"
let decoded = binaryEncoded.binaryDecodedString // -> optional("Hello World")


import Base8

let base8Encoded = Base8.encode("hello world") // -> 320625543306744035667562330620==
let base8Decoded = Base8.decode("320625543306744035667562330620") // -> "hello world"


import BaseX

/// Base10
let base10Encoded = try BaseX.encode("Hello World", into: .base10Decimal) // -> 87521618088882533792115812
let base10Decoded:String = try BaseX.decode("87521618088882533792115812", as: .base10Decimal) // -> Hello World

/// Base16 (HEX) Lowercased
let base16LEncoded = try BaseX.encode("Hello World", into: .base16Hex) // -> 48656c6c6f20576f726c64
let base16LDecoded:String = try BaseX.decode("48656c6c6f20576f726c64", as: .base16Hex) // -> Hello World

/// Base16 (HEX) Uppercased
let base16UEncoded = try BaseX.encode("Hello World", into: .base16HexUpper) // -> 48656C6C6F20576F726C64
let base16UDecoded:String = try BaseX.decode("48656C6C6F20576F726C64", as: .base16HexUpper) // -> Hello World

/// Base36 Lowercased
let base36LEncoded = try BaseX.encode("Hello World", into: .base36) // -> azw5bz2xp56m4qyck
let base36LDecoded:String = try BaseX.decode("azw5bz2xp56m4qyck", as: .base36) // -> Hello World

/// Base36 Uppercased
let base36UEncoded = try BaseX.encode("Hello World", into: .base36Upper) // -> AZW5BZ2XP56M4QYCK
let base36UDecoded:String = try BaseX.decode("AZW5BZ2XP56M4QYCK", as: .base36Upper) // -> Hello World

/// Base58BTC
let base58BTCEncoded = try BaseX.encode("Hello World", into: .base58BTC) // -> JxF12TrwUP45BMd
let base58BTCDecoded:String = try BaseX.decode("JxF12TrwUP45BMd", as: .base58BTC) // -> Hello World

/// Base58Flickr
let base58FlickrEncoded = try BaseX.encode("Hello World", into: .base58Flickr) // -> iXf12sRWto45bmC
let base58FlickrDecoded:String = try BaseX.decode("iXf12sRWto45bmC", as: .base58Flickr) // -> Hello World


import Base32

/// Standard Base32 (Uppercased w/ padding)
Base32.encode("hello world") // -> "NBSWY3DPEB3W64TMMQ======"

/// Lowercased
Base32.encode("hello world", options: .letterCase(.lower), .pad(true)) // -> "nbswy3dpeb3w64tmmq======"

/// Lowercased without padding
Base32.encode("hello world", options: .letterCase(.lower), .pad(false)) // -> "nbswy3dpeb3w64tmmq"

/// Also includes 

/// Hex variants
Base32.encode("hello world", variant: .hex, options: .letterCase(.lower), .pad(false)) // -> "d1imor3f41rmusjccg"

/// and Z variants
Base32.encode("hello world", variant: .z, options: .letterCase(.lower), .pad(false)) // -> "pb1sa5dxrb5s6hucco"

/// Decoding
try Base32.decode("d1imor3f41rmusjccg", variant: .hex) // -> "hello world"

API

/// Base2
String.binaryEncoded(using encoding:String.Encoding = .utf8, byteSpacing:Bool = false) -> String?
String.binaryDecodedString -> String?

Data(binaryString:String)
Data.binaryEncoded(byteSpacing:Bool = false) -> String

Array<UInt8>(binaryString:String)
Array<UInt8>.binaryEncoded(byteSpacing:Bool = false) -> String


/// Base8
Base8.encode(_ str:String, options:Base8Options...) -> String
Base8.decode(_ string: String) throws -> Data
Base8.decodeToString(_ string: String, using:String.Encoding = .ascii) throws -> String


/// BaseX (10, 16, 36, 58)
BaseX.encode(_ str:String, into base:BaseX.Alphabets, using encoding: String.Encoding = .utf8) throws -> String
BaseX.encode(_ data:Data, into base:BaseX.Alphabets) -> String


/// Base32 
Base32.encode(_ str:String, variant:Variant = .standard, options:Base32Options...) -> String
Base32.encode(_ data:Data, variant:Variant = .standard, options:Base32Options...) -> String
Base32.decode(_ string: String, variant:Variant = .standard) throws -> Data
Base32.decodeToString(_ string:String, variant:Variant = .standard, using:String.Encoding = .ascii) throws -> String

/// Base64
String.base64CompliantString // Ensures the base64 string is padded correctly
Data.base64URLEncoded(padded:Bool = true) -> String // Swaps "/" with "_", and "+" with "-"
Data.base64Encoded(padded:Bool = true) -> String
Data?(base64URLEncoded: String)

贡献

欢迎贡献!这段代码在很大程度上只是一个概念验证。我可以向您保证,有更好/更安全的方法可以实现相同的结果。任何建议、改进,甚至只是批评,都非常欢迎!

让我们一起让这段代码变得更好!🤝

鸣谢

许可

MIT © 2022 Breth Inc.