我有一个Swift字符数组:
static let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
我想对每个Character
作为一个字节(UInt8
)进行一些按位运算。比如说,我该如何将charArray[0]
转换为UInt8
呢?
我有一个Swift字符数组:
static let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
我想对每个Character
作为一个字节(UInt8
)进行一些按位运算。比如说,我该如何将charArray[0]
转换为UInt8
呢?
Character
的字符串表示来转换成UInt8
。但是,在[Character] -> [UInt8]
转换中,你不需要显式地初始化数组;因为String.UTF8View
(来自String.utf8
)是一个CollectionType
,你可以在String.UTF8View
本身上应用一个map
操作;使用UInt8
初始化即可。即,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> */
SequenceType
,从而更容易地在实践中使用。例如: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)}
}
}
使用示例:
let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
/* use extension function */
let asUInt8Array = charArray.asByteArray()
/* or computed property */
let asUInt8Array = charArray.byteArray
SequenceType
扩展的解决方案版本,其中 Generator.Element
限制为 Character
类型。 - dfribvar bytesArray: [UInt8] { return ... }
。 - Leo Dabuslet charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
let string = Array(String(charArray).utf8)
print(string)
var char: Character = "a"
var byte: UInt8 = Array(String(char).utf8)[0]
一定有更好的方法...
char.asciiValue!
或 "a".utf8.first!
。 - P. A. MonsailleSwift 5:
let charArray: [Character] = [ "S", "t", "r", "i", "n", "g"]
var oneAscii: UInt8 = charArray[0].asciiValue!
为了改进@dfri的答案https://dev59.com/k5Xfa4cB1Zd3GeqPaBt1#36025104
对于Swift 3,您必须使用以下内容:
extension Sequence where Iterator.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)}
}
}