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")
}