diff --git a/Sources/ULID/Data+Base32.swift b/Sources/ULID/Data+Base32.swift index b4b3e5e..8aee84b 100644 --- a/Sources/ULID/Data+Base32.swift +++ b/Sources/ULID/Data+Base32.swift @@ -43,7 +43,7 @@ extension Data { base32String.removeLast() } - let result: Data? = base32String.withCString(encodedAs: Unicode.ASCII.self) { (src) in + let result: Data? = base32String.withCString(encodedAs: Unicode.UTF8.self) { (src) in func _strlen(_ str: UnsafePointer) -> Int { var str = str var i = 0 diff --git a/Sources/ULID/ULID.swift b/Sources/ULID/ULID.swift index 1f421d2..7be8338 100644 --- a/Sources/ULID/ULID.swift +++ b/Sources/ULID/ULID.swift @@ -31,7 +31,9 @@ public struct ULID: Hashable, Equatable, Comparable, CustomStringConvertible { guard string.count == 26, let data = Data(base32Encoded: "000000" + string) else { return nil } - self.init(ulidData: data.dropFirst(4)) + withUnsafeMutableBytes(of: &ulid) { + $0.copyBytes(from: data.dropFirst(4)) + } } public init(timestamp: Date = Date()) { diff --git a/Tests/ULIDTests/Data+Base32Tests.swift b/Tests/ULIDTests/Data+Base32Tests.swift index 8e3ca9e..6217b26 100644 --- a/Tests/ULIDTests/Data+Base32Tests.swift +++ b/Tests/ULIDTests/Data+Base32Tests.swift @@ -134,6 +134,15 @@ final class Base32Tests: XCTestCase { XCTAssertEqual("GGGGGGG=", data.base32EncodedString()) } + func testEncodeNoPad() { + let bytes: [UInt8] = [ + 0b10000100 + ] + let data = Data(bytes: bytes) + + XCTAssertEqual("GG", data.base32EncodedString(padding: false)) + } + // MARK: - // MARK: Decode @@ -203,6 +212,18 @@ final class Base32Tests: XCTestCase { } } + func testDecodePadding() { + let data = Data(base32Encoded: "AM======") + XCTAssertNotNil(data) + XCTAssertEqual(1, data!.count) + XCTAssertEqual(0b01010101, data![0]) + } + + func testDecodeIncorrectLength() { + let data = Data(base32Encoded: "0") + XCTAssertNil(data) + } + // MARK: - static var allTests = [ @@ -219,9 +240,12 @@ final class Base32Tests: XCTestCase { ("testEncodePad2", testEncodePad2), ("testEncodePad3", testEncodePad3), ("testEncodePad4", testEncodePad4), + ("testEncodeNoPad", testEncodeNoPad), ("testDecodeBase32", testDecodeBase32), ("testDecodeTable", testDecodeTable), - ("testDecodeInvalidCharacter", testDecodeInvalidCharacter) + ("testDecodeInvalidCharacter", testDecodeInvalidCharacter), + ("testDecodePadding", testDecodePadding), + ("testDecodeIncorrectLength", testDecodeIncorrectLength) ] } diff --git a/Tests/ULIDTests/ULIDTests.swift b/Tests/ULIDTests/ULIDTests.swift index fd732c1..ebdb537 100644 --- a/Tests/ULIDTests/ULIDTests.swift +++ b/Tests/ULIDTests/ULIDTests.swift @@ -130,13 +130,13 @@ final class ULIDTests: XCTestCase { func testComparable1() { let lhs = ULID(ulid: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) - let rhs = ULID(ulid: (0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + let rhs = ULID(ulid: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)) XCTAssertTrue(lhs < rhs) XCTAssertFalse(lhs > rhs) } func testComparable2() { - let lhs = ULID(ulid: (0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) + let lhs = ULID(ulid: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)) let rhs = ULID(ulid: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) XCTAssertFalse(lhs < rhs) XCTAssertTrue(lhs > rhs)