SPB Git

spb/os-vault Public

Self-custody, multi-chain crypto wallet for macOS. One recovery phrase, six chain families, zero API keys — nothing leaves your Mac.

Swift 96% Shell 3.4% Makefile 0.6%
1.5 KB · 63 lines swift
Raw Blame History
1import Foundation23public extension Data {4    var decodedLength: Int {5        var len: UInt8 = 06        var size: UInt8 = 07        var bytes = self8        while true {9            guard let elem = bytes.first else { break }10            bytes = bytes.dropFirst()11            len |= (elem & 0x7F) << (size * 7)12            size += 113            if elem & 0x80 == 0 {14                break15            }16        }17        return Int(len)18    }1920    mutating func decodeLength() -> Int {21        var len: UInt8 = 022        var size: UInt8 = 023        while true {24            guard let elem = bytes.first else { break }25            _ = popFirst()26            len |= (elem & 0x7F) << (size * 7)27            size += 128            if elem & 0x80 == 0 {29                break30            }31        }32        return Int(len)33    }3435    static func encodeLength(_ len: Int) -> Data {36        encodeLength(UInt(len))37    }3839    private static func encodeLength(_ len: UInt) -> Data {40        var rem_len = len41        var bytes = Data()42        while true {43            var elem = rem_len & 0x7F44            rem_len = rem_len >> 745            if rem_len == 0 {46                bytes.append(UInt8(elem))47                break48            } else {49                elem = elem | 0x8050                bytes.append(UInt8(elem))51            }52        }53        return bytes54    }55}5657public extension Encodable {58    var jsonString: String? {59        guard let data = try? JSONEncoder().encode(self) else { return nil }60        return String(data: data, encoding: .utf8)61    }62}63