Массив символов или сохранение строки в структуре без указателя (не используя NSString — я думаю) в objective C

#iphone #objective-c #data-structures #string #nsstring

#iPhone #objective-c #структуры данных #строка #nsstring

Вопрос:

Я создаю игру на objective C, используя движок cocos 2d для iPhone. В настоящее время я отправляю пакеты данных клиентам и от них, используя структуры:

 typedef struct
{
PacketType type;
CGPoint position;
int amount;
int playerId;
} PacketPlayerDamage;
  

Моя проблема в том, что я хочу отправить строку в том же формате, иначе мне придется внести некоторые довольно серьезные изменения, в идеале должно работать следующее:

 typedef struct
{
    PacketType type;
    NSString *name;
} PacketHello
  

Я считаю, что это не работает, поскольку, когда я завершаю свой пакет для его отправки, я делаю следующее:

 PacketPlayerDamage packet;
packet.type = kPacketTypePlayerDamage;
packet.amount = amount;
packet.playerId = playerId;
NSData* sendPacket = [NSData dataWithBytes:data length:sizeof(packet)];
[self sendToAll:sendPacket];
  

Который не может развернуть NSString и выдает ошибку, возможно, потому, что он не знает размер / длину этой переменной в структуре.

Итак, поскольку я на самом деле не хочу изменять способ, которым я оборачиваю или разворачиваю свой пакет данных (я преобразовывал NSMutableDictionary в JSON, и все было нормально, но это кажется шагом назад), но я хочу разрешить отправку строки (очевидно, что фиксированная длина / размер строки в порядке, т. Е. 32 символа), мой вопрос….

Есть ли простой способ обработать строку фиксированной длины без указателя в objective C, массив из 32 символов или что-то подобное?

Я видел следующее:

 UTF8String option1;
Str32 option2;
  

Это то, что я ищу? Если да, то как мне взять NSString с максимальным значением 32 символа и применить его к ним (и я предполагаю, что заголовок не так актуален …)

Спасибо за вашу помощь,

JT

Ответ №1:

Вы можете использовать — (BOOL)getCString:(char *)максимальная длина буфера:(NSUInteger)Кодировка maxBufferCount:(NSStringEncoding) метод кодирования в NSString. Итак, вы бы добавили в свою структуру массив символов фиксированной длины и использовали описанный выше метод для записи в него NSString:

 typedef struct
{
    PacketType type;
    char name[MAX_LENGTH];
} PacketHello

NSString* toSend = @"blahblahblah";
PacketHello myPacket;
[toSend getCString:myPacket.name maxLength:MAX_LENGTH encoding:NSUTF8StringEncoding];
  

В конце получения вы можете преобразовать ее обратно в NSString с — (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

 PacketHello received;
NSString* name = [[NSString alloc] initWithCString:received.name encoding:NSUTF8StringEncoding];
  

Комментарии:

1. Просто примечание: MAX_LENGTH включает пробел для нулевого байта, поэтому, если вы хотите отправить 32 символа, это должно быть 33.

2. Сработало очарование… Приветствую Дрю.