Если ваши строки имеют максимальную длину, это довольно просто и может быть сделано эффективно. Итак, предполагая, что максимальная длина строк для этих пакетов составляет 255, и вы решили использовать UTF-8 для кодирования ваших строк (обе стороны должны договориться о том, какую кодировку они используют), вы можете сделать это следующим образом:
typedef struct
{
PACKETTYPE packetType;
uint8_t stringToSend[256]; // UTF8 string with max encoded length of 255 bytes
} StringPacket;
StringPacket msg;
msg.packetType = STRING_PACKET;
[theString getCString:msg.stringToSend maxLength:256 encoding:NSUTF8StringEncoding];
NSData *packet = [NSData dataWithBytes:&msg length:sizeof(StringPacket)];
Теперь у вас будет правильная строка C в вашем пакете, содержащая не более 255 байтов строковых данных и нулевой терминатор. Обратите внимание: если ваша строка не может быть закодирована в UTF8 в указанном вами размере, метод вернет NO, поэтому ваш реальный код должен проверить это и обработать.
Если у вас нет ограничения по размеру, вы можете делать то же самое, но вам приходится иметь дело с динамическим распределением памяти, копированием байтов, созданием данных и надлежащим освобождением памяти в нужное время, поэтому это становится намного более запутанным, но это та же самая основная идея. См. Также метод -getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
для NSString, он может быть очень полезен при генерации этих сообщений, когда размер строки является динамическим и полностью неизвестным.
Однако в самом простом случае приведенный выше код должен выполнить работу.