如何在Swift Data对象中写入新数据

时间:2018-08-17 22:44:03

标签: swift pdf nsdata digital-signature

我正在尝试使用Debenu (Foxit) Quick PDF Library(适用于iOS)将PKCS#7数字签名嵌入到PDF中。根据他们提供的示例代码,我将不得不在PDF文件字节数组中写入签名(以十六进制格式)。这是用C#编写的示例代码:

public int Sign(string pdfLocation, byte[] hexSignature, int signaturePlaceholderLength, int signaturePlaceholderStartPosition)
{
    if (hexSignature.Length < signaturePlaceholderLength)
    {
        // Write the signature into the placeholder
        using (BinaryWriter writer = new BinaryWriter(new FileStream(pdfLocation, FileMode.Open)))
        {
            writer.BaseStream.Seek(signaturePlaceholderStartPosition, SeekOrigin.Begin);
            writer.BaseStream.Write(hexSignature, 0, hexSignature.Length);
        }
    }
    else
    {
        AddLog("Error: digital signature is larger than the placeholder size");
    }
}

我无法在Swift中编写相同的算法,因为我不知道如何将签名写入我的PDF Data对象:

func sign(pdfDocument: Data, hexSignature: String, signaturePlaceholderLength: Int, signaturePlaceholderStartPosition: Int) {
    if hexSignature.count < signaturePlaceholderLength {
        // how can I add hexSignature inside pdfDocument on signaturePlaceholderStartPosition?
    }
}

我看到了Data.write函数,但是它将数据的内容写到了一个位置。

还有Data.insert会在指定位置插入UInt8,但我的签名是String(十六进制)。

我尝试搜索Swift insert String inside Data object,但找不到任何有用的信息。

那么,我是否误解了Data对象以及如何在Swift上使用它们?我是否需要将签名转换为Data可以处理的内容?还是有一些辅助类需要在Data对象中插入新数据?

1 个答案:

答案 0 :(得分:0)

为什么不只将hexSignature更改为[UInt8]? 因为这就是您在C#中所做的

let hexSignatureBytes: [UInt8] = Array(hexSignature.utf8)