2016-02-23 3 views
0

Я пишу протокол bluetooth-пакетов для связи между iPhone и периферийным устройством. Устройство отправит мне несколько бит, возможно, 128 или 256, и протокол связи, который я использую, позволит мне получить доступ к этим входящим данным в качестве некоторой переменной NSData. Мой вопрос: могу ли я взять байты из NSDATA или напрямую использовать NSData, чтобы вставить байты в структуру с записями, которые имеют предопределенный размер? Например, в C, вы бы-структуру, как:SWIFT: Вставить байты из NSData to Struct?

struct CD2_CONFIG_TYPE { 
    uint8_t  header;   // '<' or '>' start of a new packet from device or base station 
    uint8_t  type;   // 'c' indicates device configuration packet 
    uint8_t  devSN[8];  // device serial number 
}; 

и позволяет сказать, что данные, которые мы получили объект NSData, который имеет 8 + 8 + 84 бита, которые являются заголовок, тип и devSN, соответственно. Так что, если я возьму эти биты (или байты) и сделать их указателем используя что-то вроде:

// swift code  
fun dataBYtesToPointer(incomingDataPacket: NSData){ 
     var packetBytes = UnsafePointer<UInt8>(incomingDataPacket.bytes) 
    } 

Есть ли способ, чтобы скопировать указатель на структуру и имеет-структуру Header переменные, тип и devSN населенную правильно на основе размера, выделенного для них? В C вы будете использовать memcopy и скопировать этот указатель на структуру. Поэтому я не понимаю, как сделать структуру с предопределенными размерами, как в примере, и я не знаю, как заполнить ее указателем. Любая помощь будет оценена по достоинству.

+0

Я думаю, что ответ на ваш вопрос здесь. http://stackoverflow.com/questions/25079380/swift-how-add-offset-to-memcpy – user3069232

ответ

0

Вы можете думать о способе C, как показано ниже:

struct CD2_CONFIG_TYPE* commandFromData(uint8_t * data){ 

    struct CD2_CONFIG_TYPE* command = (struct CD2_CONFIG_TYPE*)malloc(sizeof(struct CD2_CONFIG_TYPE)); 

    command->type = data[0]; 
    command->header = data[1]; 
    memcpy(command->devSN, &data[2], 8* sizeof(uint8_t)); 

    return command; 

} 

Вы можете экспортировать эту сигнатуру в файл .h и импортировать его в обводном заголовок так, что Swift код может получить доступ к этому.

В вашем быстром коде, вы можете назвать это как:

let bytes = UnsafePointer<UInt8>(incomingDataPacket.bytes) 
commandFromData(bytes) 
+0

Спасибо @Shripada за ответ. Я не знал, что вы можете использовать C-код так быстро. Я получил его для работы, но вместо использования 2-й, 3-й и 4-й строк функции, которую вы мне дали, я просто использовал memcpy (& command, & data, sizeof (command)); и он полностью копирует весь указатель на структуру. Я очень благодарен за вашу помощь. – vusiliyK

+0

Рад, что это помогло. Да, то, как вы копируете, также является законным. – Shripada

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