ios - 将 c 字符转换为 swift

标签 ios c swift swift2

我正在尝试将以下代码转换为 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/

相关文章:

ios - 类型 NSAttributedString 在 tableView 中没有下标成员

c++ - 我应该使用静态工作池还是动态工作池(线程)?

ios - Mapkit 标注附件按钮激活

iphone - 来自 UIButton 的 PopOver

ios - 自动改变结构? (iOS/ Storyboard)

ios - Opengles着色器插值问题

c - 如何查找一个数字在数组中重复多少次?

c++ - 如何将 3 个变量合并为 1 个变量

ios - 自定义 AlertView Controller 没有显示 View Controller 的顶部?

swift - 如何使用 Swift 从 cocoa 应用程序运行 shell 脚本?