Массив Char или Хранение строки в структуре без указателя (не использую NSString - я думаю) в цели C - PullRequest
1 голос
/ 30 апреля 2011

Я создаю игру в объективе 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 символа), мой вопрос....

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

Я видел following:

UTF8String option1;
Str32 option2;

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

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

JT

1 Ответ

3 голосов
/ 30 апреля 2011

Вы можете использовать - (BOOL) getCString: (char *) буфер maxLength: (NSUInteger) maxBufferCount кодировка: (NSStringEncoding) кодировка метод NSString. Таким образом, вы бы добавили массив char к вашей структуре с фиксированной длиной и использовали метод выше для записи в него строки 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 *) nullTeridityCString кодировка: (NSStringEncoding) кодировка

PacketHello received;
NSString* name = [[NSString alloc] initWithCString:received.name encoding:NSUTF8StringEncoding];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...