簡體   English   中英

目標 C 中的字符數組或在沒有指針的結構中存儲字符串(不使用 NSString - 我認為)

[英]Array of Char or Storing a string in a struct without a pointer (Not using NSString - I think) in objective C

我正在使用 iPhone 的 cocos 2d 引擎在目標 C 中創建游戲。 目前我正在使用結構向客戶端發送數據包和從客戶端發送數據包:

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 個字符的數組或類似的東西?

我看過以下內容:

UTF8String option1;
Str32 option2;

他們是我要找的嗎? 如果是這樣,我如何獲取最大 32 char NSString 並將其應用於它們(我猜標題不相關......)

謝謝你的幫助,

捷通

您可以在 NSString 上使用- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding方法。 因此,您將添加一個具有固定長度的 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];

在接收端,您可以使用- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding將其轉換回 NSString

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM