我需要将字符串编码为UTF-16LE(稍后转换为sha1),但我遇到了一些问题。这就是我的尝试:
let utf16array = Array("password".utf16)
print(utf16array)
// [112, 97, 115, 115, 119, 111, 114, 100]
但这正是我所期待的:
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, 100, 0]
使用utf8array同样的事情:
let utf8array = "password".utf8.map({ $0 as UInt8 })
// [112, 97, 115, 115, 119, 111, 114, 100]
所以,这就是我所做的"修复"它:
var bytesArray:[UInt16] = []
for byte in utf16array {
bytesArray.append(byte)
bytesArray.append(0)
}
print(bytesArray)
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, 100, 0]
但我确定这不是正确的方法。有什么建议吗?
答案 0 :(得分:5)
您可以使用
获取UTF-16LE数据的表示形式let password = "password€"
let data = password.data(using: .utf16LittleEndian)!
print(data as NSData)
// <70006100 73007300 77006f00 72006400 ac20>
这已经足以计算SHA1摘要(代码 来自How to crypt string to sha1 with Swift?):
var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA1($0, CC_LONG(data.count), &digest)
}
let hexEncodedDigest = digest.map { String(format: "%02hhx", $0) }.joined()
print(hexEncodedDigest)
// 177f0d080dfe533e102dd67d6321204813cf1b0c
但是如果你需要它作为字节数组那么
let bytesArray = data.map { $0 }
print(bytesArray)
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, 100, 0, 172, 32]
会起作用。
(我附加了一个非ASCII字符用于演示,
€ = U+20AC
变为172, 32
。)
如果您很好奇如何将[UInt16]
数组转换为
[UInt8]
数组,这是你用一些指针杂耍的方法
(只是一个副本):
let utf16array = Array("password€".utf16)
print(utf16array)
// [112, 97, 115, 115, 119, 111, 114, 100, 8364]
let bytes = Array(utf16array.withUnsafeBufferPointer {
$0.baseAddress!.withMemoryRebound(to: UInt8.self, capacity: 2 * utf16array.count) {
UnsafeBufferPointer(start: $0, count: 2 * utf16array.count)
}
})
print(bytes)
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, 100, 0, 172, 32]
答案 1 :(得分:0)
此处使用String
to Data
method data(using:)
是适合目的的解决方案。
但是为了它的乐趣,另一种方法是使用OP的String
:UTF-16编码方法(utf16
属性String
)。使用init(truncatingBitPattern: UInt16)
的{{1}}初始值设定项,结合UInt8
后跟zip
,后者将压缩后的元组展平为数组:
flatMap
答案 2 :(得分:0)
如何使用http://www.cis.syr.edu/~wedu/seed/Documentation/Minix3/Inode.pdf访问者?
var bytes = str.cStringUsingEncoding(NSUTF16LittleEndianStringEncoding)