Как преобразовать последовательность кода ASCII в строку в Swift 4? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть последовательность кодов ASCII в строковом формате, например (7297112112121326610511411610410097121). Как преобразовать это в текстовый формат.

Я пробовал ниже код:

func convertAscii(asciiStr: String) {
    var asciiString = ""
    for asciiChar in asciiStr {
        if let number = UInt8(asciiChar, radix: 2) { // Cannot invoke initializer for type 'UInt8' with an argument list of type '(Character, radix: Int)'
            print(number)
            let character = String(describing: UnicodeScalar(number))
            asciiString.append(character)
        }
    }
}

convertAscii(asciiStr: "7297112112121326610511411610410097121")

Но получаю ошибку в if let number строке.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Как уже упоминалось, десятичные значения ASCII находятся в диапазоне 0-255 и могут содержать более 2 цифр

На основании ответа Султана и при условии, что в нем нет символов <32 (0x20) и> 199 (0xc7)в тексте этот подход проверяет первый символ обрезанной строки.Если это «1», то символ представлен 3 цифрами, иначе 2.

func convertAscii(asciiStr: String) {
    var source = asciiStr

    var result = ""

    while source.count >= 2 {
        let digitsPerCharacter = source.hasPrefix("1") ? 3 : 2
        let charBytes = source.prefix(digitsPerCharacter)
        source = String(source.dropFirst(digitsPerCharacter))
        let number = Int(charBytes)!
        let character = UnicodeScalar(number)!
        result += String(character)
    }

    print(result) // "Happy Birthday"
}

convertAscii(asciiStr: "7297112112121326610511411610410097121")
0 голосов
/ 10 сентября 2018

Если мы считаем, что строка состоит из символов, где каждый символ представлен 2 десятичными буквами, то что-то вроде этого будет работать (это всего лишь пример, не оптимальный).

func convertAscii(asciiStr: String) {
    var source = asciiStr

    var characters: [String] = []

    let digitsPerCharacter = 2

    while source.count >= digitsPerCharacter {
        let charBytes = source.prefix(digitsPerCharacter)
        source = String(source.dropFirst(digitsPerCharacter))
        let number = Int(charBytes, radix: 10)!
        let character = UnicodeScalar(number)!
        characters.append(String(character))
    }

    let result: String = characters.joined()
    print(result)
}

convertAscii(asciiStr: "7297112112121326610511411610410097121")

Однакосам формат неоднозначен, потому что символы ASCII могут принимать от 1 до 3 десятичных цифр, поэтому для правильного разбора необходимо, чтобы все символы имели одинаковую длину (например, 1 должно быть 001).

Обратите внимание, что я беру всегда одинаковое количество букв, затем преобразую их в число, а затем создаю символ числа.

...