Просмотр исходного кода

Convenience initializer of Array of bytes with Hex string. Array<UInt8>(hex: "0xb1b1b2b2")

Marcin Krzyżanowski 9 лет назад
Родитель
Сommit
f7dc582074
2 измененных файлов с 20 добавлено и 0 удалено
  1. 5 0
      CryptoSwiftTests/ExtensionsTest.swift
  2. 15 0
      Sources/CryptoSwift/Array+Extension.swift

+ 5 - 0
CryptoSwiftTests/ExtensionsTest.swift

@@ -101,4 +101,9 @@ final class ExtensionsTest: XCTestCase {
         XCTAssertEqual(decrypted, "my secret string")
     }
 
+    func test_Array_init_hex() {
+        let bytes = Array<UInt8>(hex: "0xb1b1b2b2")
+        XCTAssertEqual(bytes, [177,177,178,178])
+    }
+
 }

+ 15 - 0
Sources/CryptoSwift/Array+Extension.swift

@@ -23,3 +23,18 @@ extension Array {
     }
 }
 
+extension Array where Element: Integer, Element.IntegerLiteralType == UInt8 {
+    public init(hex: String) {
+        self.init()
+        
+        let utf8 = Array<Element.IntegerLiteralType>(hex.utf8)
+        let skip0x = hex.hasPrefix("0x") ? 2 : 0
+        for idx in stride(from: utf8.startIndex.advanced(by: skip0x), to: utf8.endIndex, by: utf8.startIndex.advanced(by: 2)) {
+            let byteHex = "\(UnicodeScalar(utf8[idx]))\(UnicodeScalar(utf8[idx.advanced(by: 1)]))"
+            if let byte = UInt8(byteHex, radix: 16) {
+                self.append(byte as! Element)
+            }
+        }
+    }
+}
+