如何将PKCS5应用于NSData?
似乎没有太多关于此的信息,我发现这个Objective-C solution可行,但我正在寻找一个更快的"如果可能的话。
这是我失败的尝试:
func pkcs5(data: NSData, blocksize: Int = 16) -> NSMutableData {
var data = NSMutableData(data: data)
let count = blocksize - data.length % blocksize
for _ in 0...count {
// somehow append the equivalent of chr(count) to data
}
return data
}
如果您了解Python,请参阅我尝试复制的功能:
def pkcs5_pad(data, blocksize=16):
pad_count = blocksize - len(data) % blocksize
return data + (chr(pad_count) * pad_count).encode('utf-8')
感谢。
答案 0 :(得分:2)
您可以使用appendBytes()
:
func pkcs5(data: NSData, blocksize: Int = 16) -> NSMutableData {
var data = NSMutableData(data: data)
var count = UInt8(blocksize - data.length % blocksize)
for _ in 0 ..< count {
data.appendBytes(&count, length: 1)
}
return data
}
“技巧”是将count
声明为UInt8
类型的变量,以便您
可以使用&count
传递指针。
或者,您可以先创建一个带填充字节的数组,然后再创建一个数组 一步追加数据:
func pkcs5(data: NSData, blocksize: Int = 16) -> NSData {
var data = NSMutableData(data: data)
let count = blocksize - data.length % blocksize
let padding = [UInt8](count: count, repeatedValue: UInt8(count))
data.appendBytes(padding, length: count)
return data
}
答案 1 :(得分:1)
我认为@MartinR答案没问题,但如果你想要更多例子:
使用libc
:效果
func pkcs5_mem(data: NSData, blocksize: Int = 16) -> NSData {
let count = blocksize - data.length % blocksize
let buf = UnsafeMutablePointer<UInt8>(malloc(UInt(data.length + count)))
// you should check `buf` is not `nil` here
memcpy(buf, data.bytes, UInt(data.length))
memset(buf + data.length, Int32(count), UInt(count))
return NSData(bytesNoCopy: buf, length: data.length + count)
}
使用NSMutableData
:安全轻松
func pkcs5_mutable(data: NSData, blocksize: Int = 16) -> NSData {
let count = blocksize - data.length % blocksize
let result = NSMutableData(capacity: data.length + count)!
result.appendBytes(data.bytes, length: data.length)
result.appendBytes([UInt8](count: count, repeatedValue: UInt8(count)), length: count)
return result
}
使用Array
作为缓冲区:可能很慢
func pkcs5_array(data: NSData, blocksize: Int = 16) -> NSData {
let count = blocksize - data.length % blocksize
var buf = [UInt8]()
buf.reserveCapacity(data.length + count)
buf += UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(data.bytes), count: data.length)
buf += [UInt8](count: count, repeatedValue: UInt8(count))
return NSData(bytes: buf, length: buf.count)
}