Ваш код не делает то, что вы думаете. Эта линия:
если позволяют данные = hexString.data (с помощью: .utf8) {
означает "закодировать эти символы в кодировке UTF-8." Это означает, что «01» не кодируется в 0x01 (1), он кодирует 0x30 0x31 («0» «1»). Там нигде нет «шестерки».
Эта линия:
return String.init(data:data, encoding: .utf8)
просто принимает кодированные данные UTF-8, интерпретирует это как UTF-8, и возвращает его. Эти два метода являются симметричными, поэтому вы должны ожидать, что вся эта функция вернет все, что было передано.
Собрать комментарии Мартина и Ларма в одном месте. Это, по-видимому, кодируется на латинице-1. (Это очень неудобно способ кодирования этой информации, но если это то, что вы ищете, я думаю, что это кодировка.)
import Foundation
extension Data {
// From http://stackoverflow.com/a/40278391:
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 }
}
}
let d = Data(fromHexEncodedString: "dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4")!
let s = String(data: d, encoding: .isoLatin1)
See http://stackoverflow.com/a/40278391/1187415 для метода создания «данных» из строки с шестнадцатеричным кодированием. –
Но ваши данные не выглядят как допустимая строка в любой известной кодировке ... –
Преобразование, как было предложено Марин R, представлением шестнадцатеричных, которое является строкой, в его эквивалент в '(NS) Data'. И используйте 'NSASCIIStringEncoding', а не' NSUTF8StringEncoding'. Я получаю в Objective-C правильный результат 'Ü ° J: \ Øμ7cï \t ¼f« à) ýë®^A ~/ü * ¤' с ASCII, но null с UTF8. – Larme