#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. Сработало очарование… Приветствую Дрю.