簡體   English   中英

iOS開發:如何將字符串封裝在NSData對象中?

[英]iOS Development: How can I encapsulate a string in an NSData object?

我正在iPhone上構建多人游戲,我需要將字符串數據發送給游戲中的其他玩家。 為此,我需要以某種方式將NSString *字符串數據封裝在NSData對象中。 這是我的代碼結構的一個示例...

typedef struct 
{
   PACKETTYPE packetType;
   ??? stringToSend;  //<---not sure how to store this
} StringPacket;    

StringPacket msg;
msg.packetType = STRING_PACKET;
msg.stringToSend = ...  //  <---not sure what to do here
NSData *packet = [NSData dataWithBytes:&msg length:sizeof(StringPacket)];

所以我的問題是,如果StringPacket是在標頭中定義的結構,則stringToSend屬性應為哪種類型,以便我可以輕松調用NSDatadataWithBytes方法將數據包數據封裝在NSData對象中?

感謝您的智慧!

首先,您應該通過[NSString UTF8String]將NSString轉換為UTF8表示形式。 在那之后,我建議存儲在數據包字符串長度中,然后-字符串字符本身。 所有這些都可以通過附加NSData來完成,該NSData是通過[NSData dataWithBytes:]從char *創建的

NSMutableData packet = [[NSMutableData alloc] init];
[packet appendBytes:&msg.packetType, sizeof(msg.packetType)];
char *str = [yourString UTF8String];
int len = strlen(str);
[packet appendBytes:(void*)&len, sizeof(len)];
[packet appendBytes:(void*)str, len];

要解析數據包,您應該執行以下操作:

NSData packet; // your packet
[packet getBytes:(void*)&packet.msg range:NSMakeRange(0, sizeof(packet.msg))];
int len;
[packet getBytes:(void*)&len range:NSMakeRange(sizeof(packet.msg), sizeof(len)];
NSData *strData = [packet subdataWithRange:NSMakeRange(sizeof(packet.msg) + sizeof(len)), packet.length];
NSString *str = [[NSString alloc] initWithData:strData encoding:UTF8Encoding];

自從我從內存中寫入數據以來,可能會有一些錯誤,但是我想您會明白的。

如果您的字符串有最大長度,這很簡單並且可以有效地完成。 因此,假設這些數據包的字符串最大長度為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: ,在生成這些消息(字符串大小是動態的且完全未知)時,它非常有用。

但是,對於最簡單的情況,上面的代碼應該可以完成工作。

暫無
暫無

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

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