2016-02-20 2 views
0

Я пытаюсь CONVER следующего кода Свифта:новообращенного с голец к быстрым

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) }; 

Моим быстр код выглядит следующим образом:

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> 

ObjC для следующего кода:

[NSData dataWithBytes:rsa2048Asn1Header length:sizeof(rsa2048Asn1Header)]; 

печатает

<30820122 300d0609 2a864886 f70d0101 01050003 82010f00> size: 24 

глядя на яблоко документации, strideOfvalue должен возвращать правильный размер для каждого из тех [CUnsignedChar] но то не кажется, в этом случае мой вопрос не должен иметь [CUnsignedChar] того же размера, что и присвоенный char [] в objc, если не то, что я могу использовать для изменения?

также [[CUnsignedChar]] не имеет никакого смысла в моей голове, как бы код ниже конвертировался в swift, должен ли я преобразовать эти массивы в NSString и извлечь CString, когда потребуется, и если да, какую кодировку я должен использовать?

static unsigned char *asn1HeaderBytes[3] = { rsa2048Asn1Header, rsa4096Asn1Header, ecDsaSecp256r1Asn1Header }; 

ответ

1

Я не думаю, что strideofValue это функция, которую вы ищете. Я не слышал об этом раньше, но в документации указано:

Возвращает наименьший возможный интервал между различными экземплярами T в памяти. Результат всегда положительный.

Если это возвращается 8, что означает, что минимальное расстояние между [CUnsignedChar] с в памяти составляет 8 байт.

Чтобы правильно использовать NSData(data:length:), вторым параметром должен быть размер массива. Вы можете использовать count свойство для этого:

let data: NSData = NSData(bytes: rsa2048Asn1Header, length:rsa2048Asn1Header.count) 

[[CUnsignedChar]] представляет собой массив из массивов (двумерный массив) CUnsignedChar.

Ваши заголовки являются необработанными байтами, поэтому технически никакая кодировка не является «правильной» для преобразования в NSString. Криптографические заголовки, которые у вас есть, не выглядят как строки и содержат непечатаемые символы.

+0

Что касается подсчета, это имеет смысл, я попытаюсь продолжить реализацию. Я все еще не знаю, что будет эквивалентом указателя asniheaderbytes. – RicardoDuarte

1

Вы не должны использовать функцию strideofValue. 'strideofValue' не заменяет 'sizeof'. Просто зайдите в свойство «.count». enter image description here

+0

Спасибо, я пробовал все виды, но почему-то никогда не думал об использовании count :( – RicardoDuarte

Смежные вопросы