Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert Character to UInt8 in Swift

Tags:

swift

I've got an array of Characters in swift:

static let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]

And I'd like to do some bitwise operations on each Character as a byte (UInt8). How do I convert charArray[0] to UInt8, for example?

like image 880
JBaczuk Avatar asked Mar 15 '16 23:03

JBaczuk


3 Answers

You will need to go via the String representation of the Character:s to convert to UInt8. You needn't, however, explicitly initialize an array in your [Character] -> [UInt8] conversion; since String.UTF8View (from String.utf8) is a CollectionType, you can apply a map operation on the String.UTF8View itself; with an UInt8 initialization. I.e.,

let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
let asUInt8Array = String(charArray).utf8.map{ UInt8($0) }

print(asUInt8Array)
/* [83, 116, 114, 105, 110, 103] */

print(asUInt8Array.dynamicType)
/* Array<UInt8> */

With regard to your comment below ("frustrated over the abstraction of Swift, as compared to the simple ways of Objective-C"): if you believe the above to be messy, you could include it in an extension to SequenceType constrained to Character elements, allowing easier use in practice. E.g.:

extension SequenceType where Generator.Element == Character {

    /* extension accessible as function */
    func asByteArray() -> [UInt8] {
        return String(self).utf8.map{UInt8($0)}
    }

    /* or, as @LeoDabus pointed out below (thanks!),
       use a computed property for this simple case  */
    var byteArray : [UInt8] {
        return String(self).utf8.map{UInt8($0)}
    }
}

Usage example:

let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]

/* use extension function */
let asUInt8Array = charArray.asByteArray()

/* or computed property */
let asUInt8Array = charArray.byteArray
like image 150
dfrib Avatar answered Nov 10 '22 07:11

dfrib


I'm not sure how to convert a Character to UTF-8, but a String has a utf8 property, so you could use the following:

let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
let string = Array(String(charArray).utf8)
print(string)
like image 31
Michael Avatar answered Nov 10 '22 07:11

Michael


This is how I ended up doing it:

var char: Character = "a"
var byte: UInt8 = Array(String(char).utf8)[0]

There must be a better way...

like image 30
JBaczuk Avatar answered Nov 10 '22 06:11

JBaczuk