我正在尝试将以下代码转换为 swift:
static unsigned char rsa2048Asn1Header[] = {
0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00
};
static unsigned char rsa4096Asn1Header[] = {
0x30, 0x82, 0x02, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0f, 0x00
};
static unsigned char ecDsaSecp256r1Asn1Header[] = {
0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
0x42, 0x00
};
static unsigned char *asn1HeaderBytes[3] = { rsa2048Asn1Header, rsa4096Asn1Header, ecDsaSecp256r1Asn1Header };
static unsigned int asn1HeaderSizes[3] = { sizeof(rsa2048Asn1Header), sizeof(rsa4096Asn1Header), sizeof(ecDsaSecp256r1Asn1Header) };
我的 swift 代码如下所示:
let rsa2048Asn1Header:[CUnsignedChar] = [0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00]
let rsa4096Asn1Header:[CUnsignedChar] = [0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00]
let ecDsaSecp256r1Asn1Header:[CUnsignedChar] = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00]
let asn1HeaderBytes:[[CUnsignedChar]] = [rsa2048Asn1Header, rsa4096Asn1Header, ecDsaSecp256r1Asn1Header]
let asn1HeaderSizes:[UInt] = [sizeof(rsa2048Asn1Header.dynamicType).toUInt, sizeof(rsa4096Asn1Header.dynamicType).toUInt, sizeof(ecDsaSecp256r1Asn1Header.dynamicType).toUInt]
但是我在他身上失败了,例如使用 rsa2048Asn1Header 并将其转换为 NSData:
let data:NSData = NSData(bytes: rsa2048Asn1Header, length:strideofValue(rsa2048Asn1Header))
长度为 8 的快速打印:
<30820122 300d0609>
以下代码的对象:
[NSData dataWithBytes:rsa2048Asn1Header length:sizeof(rsa2048Asn1Header)];
打印
<30820122 300d0609 2a864886 f70d0101 01050003 82010f00> size: 24
查看苹果文档,strideOfvalue 应该为每个 [CUnsignedChar] 返回正确的大小,但情况似乎并非如此,我的问题是 [CUnsignedChar] 不应该与 objc 中的 usigned char [] 具有相同的大小,如果不是,我可以用什么来改变?
另外 [[CUnsignedChar]] 在我看来毫无意义,下面的代码将如何转换为 swift,我是否应该将这些数组转换为 NSString 并在需要时提取 CString,如果是这样我应该使用什么编码?
static unsigned char *asn1HeaderBytes[3] = { rsa2048Asn1Header, rsa4096Asn1Header, ecDsaSecp256r1Asn1Header };
最佳答案
我认为 strideofValue
不是您要查找的函数。我以前没听说过,但文档说明:
Returns the least possible interval between distinct instances of T in memory. The result is always positive.
如果返回 8
,则意味着内存中 [CUnsignedChar]
之间的最小距离为 8 个字节。
要正确使用 NSData(data:length:)
,第二个参数需要是数组的大小。您可以为此使用 count
属性:
let data: NSData = NSData(bytes: rsa2048Asn1Header, length:rsa2048Asn1Header.count)
[[CUnsignedChar]]
是CUnsignedChar
的数组(二维数组)的数组。
您的 header 是原始字节,因此从技术上讲,没有编码是“正确”转换为 NSString
。您拥有的加密 header 似乎不是字符串,而是包含不可打印的字符。
关于ios - 将 c 字符转换为 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522329/