without literal imprimir hexadecimal python swift hex bin

literal - python int to hex without 0x



conversión de cadena hexadecimal/binaria en Swift (3)

No estoy realmente familiarizado con Python y las comprobaciones que realiza cuando convierte los números, pero puede expandir la función a continuación:

func convert(_ str: String, fromRadix r1: Int, toRadix r2: Int) -> String? { if let num = Int(str, radix: r1) { return String(num, radix: r2) } else { return nil } } convert("11111111", fromRadix: 2, toRadix: 16) convert("ff", fromRadix: 16, toRadix: 2)

Python tiene dos métodos de biblioteca muy útiles (binascii.a2b_hex (keyStr) y binascii.hexlify (keyBytes)) con los que he estado luchando en Swift. ¿Hay algo fácilmente disponible en Swift? Si no, ¿cómo se implementaría? Dados todos los límites y otras comprobaciones (como la clave de longitud par) se realizan.


Swift 2

extension NSData { class func dataFromHexString(hex: String) -> NSData? { let regex = try! NSRegularExpression(pattern: "^[0-9a-zA-Z]*$", options: .CaseInsensitive) let validate = regex.firstMatchInString(hex, options: NSMatchingOptions.init(rawValue: 0), range: NSRange(location: 0, length: hex.characters.count)) if validate == nil || hex.characters.count % 2 != 0 { return nil } let data = NSMutableData() for i in 0..<hex.characters.count/2 { let hexStr = hex.substring(i * 2, length: 2) var ch: UInt32 = 0 NSScanner(string: hexStr).scanHexInt(&ch) data.appendBytes(&ch, length: 1) } return data } } let a = 0xabcd1234 print(String(format: "%x", a)) // Hex to String NSData.dataFromHexString("abcd1234") // String to hex


Data de Swift 3 no tienen un método "incorporado" para imprimir su contenido como una cadena hexadecimal o para crear un valor de Data partir de una cadena hexadecimal.

Los métodos de "Datos a cadena hexadecimal" se pueden encontrar, por ejemplo, en ¿Cómo convertir datos a cadena hexadecimal en swift o Cómo imprimir el contenido de un tipo de datos variable usando swift? o convertir cadenas a datos en swift 3.0 . Aquí hay una implementación desde el primer enlace:

extension Data { func hexEncodedString() -> String { return map { String(format: "%02hhx", $0) }.joined() } }

Aquí hay una posible implementación de la conversión inversa de "cadena hexadecimal a datos" (tomada de cadena hexadecimal a bytes (NSData) en la revisión de código, traducida a Swift 3 y mejorada) como un inicializador fallable:

extension Data { init?(fromHexEncodedString string: String) { // Convert 0 ... 9, a ... f, A ...F to their decimal value, // return nil for all other input characters func decodeNibble(u: UInt16) -> UInt8? { switch(u) { case 0x30 ... 0x39: return UInt8(u - 0x30) case 0x41 ... 0x46: return UInt8(u - 0x41 + 10) case 0x61 ... 0x66: return UInt8(u - 0x61 + 10) default: return nil } } self.init(capacity: string.utf16.count/2) var even = true var byte: UInt8 = 0 for c in string.utf16 { guard let val = decodeNibble(u: c) else { return nil } if even { byte = val << 4 } else { byte += val self.append(byte) } even = !even } guard even else { return nil } } }

Ejemplo:

// Hex string to Data: if let data = Data(fromHexEncodedString: "0002468A13579BFF") { let idata = Data(data.map { 255 - $0 }) // Data to hex string: print(idata.hexEncodedString()) // fffdb975eca86400 } else { print("invalid hex string") }