Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PKCS#5在Swift中填充_Swift_Pkcs#5 - Fatal编程技术网

PKCS#5在Swift中填充

PKCS#5在Swift中填充,swift,pkcs#5,Swift,Pkcs#5,如何将PKCS5应用于NSData 似乎还没有太多关于这方面的信息,我发现这将是可行的,但我正在寻找一个“快速”的方法,如果可能的话 以下是我失败的尝试: func pkcs5(data: NSData, blocksize: Int = 16) -> NSMutableData { var data = NSMutableData(data: data) let count = blocksize - data.length % blocksize for _

如何将PKCS5应用于NSData

似乎还没有太多关于这方面的信息,我发现这将是可行的,但我正在寻找一个“快速”的方法,如果可能的话

以下是我失败的尝试:

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')

谢谢。

您可以使用
appendBytes()


我认为@MartinR-answer没有问题,但如果您想要更多示例:

使用
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)
}
使用
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)
}
func pkcs5_数组(数据:NSData,块大小:Int=16)->NSData{
let count=blocksize-data.length%blocksize
变量buf=[UInt8]()
基本储备容量(数据长度+计数)
buf+=UnsafeBufferPointer(开始:UnsafePointer(data.bytes),计数:data.length)
buf+=[UInt8](计数:计数,重复值:UInt8(计数))
返回NSData(字节:buf,长度:buf.count)
}

@AndréDaniel:我添加了另一个版本,看起来更快速一些。但我怀疑它在性能上有什么不同,所以这主要是一个品味的问题。谢谢,效果很好。我还包括了你关于
0.的建议。我做了一些性能测试:你的pkcs5_mem函数的速度与我的第一个函数差不多,比pkcs5_mutable快三倍,pkcs5_mutable的速度与我的第二个函数差不多(这也难怪,因为它们几乎相等)。pkcs5_阵列甚至更慢。
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)
}
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
}
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)
}