Eine Variante von @OOPer's solution wäre eine bedingte Bindung while
Schleife und index(_:offsetBy:limitedBy:)
zu verwenden, um über die 8 Zeichen Teilstrings iterieren, unter Ausnutzung der Tatsache, dass index(_:offsetBy:limitedBy:)
nil
zurückgibt, wenn Sie versuchen, über das Limit hinaus zu kommen.
let binaryBits = "010010000110010101111001"
var result = ""
var index = binaryBits.startIndex
while let next = binaryBits.index(index, offsetBy: 8, limitedBy: binaryBits.endIndex) {
let asciiCode = UInt8(binaryBits[index..<next], radix: 2)!
result.append(Character(UnicodeScalar(asciiCode)))
index = next
}
print(result) // Hey
Bitte beachte, dass wir über Character
fahren anstatt String
in dem Zwischenschritt - das ist einfach die Tatsache zunutze zu tragen, dass Character
is specially optimised für Fälle, in denen die UTF-8-Darstellung in 63 Bytes paßt, das ist der Fall hier. Dies spart die Zwischenspeicherung eines Zwischenpuffers für jedes Zeichen.
Rein zum Spaß es könnte ein anderer Ansatz sein sequence(state:next:)
zu verwenden, um eine Folge von den Start- und Zielindizes jeder Teilkette zu erstellen, und dann reduce
, um die resultierenden Zeichen zusammen in ein verketten string:
let binaryBits = "010010000110010101111001"
// returns a lazily evaluated sequence of the start and end indices for each substring
// of 8 characters.
let indices = sequence(state: binaryBits.startIndex, next: {
index -> (index: String.Index, nextIndex: String.Index)? in
let previousIndex = index
// Advance the current index – if it didn't go past the limit, then return the
// current index along with the advanced index as a new element of the sequence.
return binaryBits.characters.formIndex(&index, offsetBy: 8, limitedBy: binaryBits.endIndex) ? (previousIndex, index) : nil
})
// iterate over the indices, concatenating the resultant characters together.
let result = indices.reduce("") {
$0 + String(UnicodeScalar(UInt8(binaryBits[$1.index..<$1.nextIndex], radix: 2)!))
}
print(result) // Hey
auf dem Gesicht von ihm, scheint dies viel weniger effizient als die erste Lösung zu sein (aufgrund der Tatsache, dass reduce
bei jeder Iteration die Zeichenfolge kopieren soll) - aber es scheint der Compiler in der Lage, Führen Sie einige Optimierungen durch, um es nicht viel langsamer als die erste Lösung zu machen.
Ich denke, Ihre Lösung zu einfach ist. – javimuu
das ist nicht meine lösung, ich brauche eine o erhalten ascii werte nicht ints – Appygix