gpt4 book ai didi

iphone - 解析 NSData 对象以获取信息

转载 作者:行者123 更新时间:2023-11-28 23:04:46 26 4
gpt4 key购买 nike

我有一个 NSData 对象从我的服务器返回,它的内容各不相同,但坚持特定的结构。

我想知道(希望通过一些示例代码)如何通过这个对象来获取我需要的数据。

对象内部的数据对象结构是这样的

  • 前导值 (UInt16) -(告诉我它是响应的哪一部分)
  • 字符串的大小 (UInt32) 数字 - (UInt32)
  • 字符串(非空终止),即后跟下一个前导值。

我一直在阅读 Binary Data Programming Guide然而,这只是真正向我展示了如何将我的数据放入新的 NSData 对象以及访问和编译字节。

我坚持的事情是我怎么说动态抓取信息。检查 NSdata 对象第一个前导值,确定它的字符串或 int,然后获取字符串或 int 并移动到下一个前导值。

任何建议或示例代码都会非常有帮助..只是陷入了思维障碍,因为我从未在 objective-c 中尝试过这样的事情。

最佳答案

其中一些取决于您的服务器是如何编写的,以将数据编码为它发送给您的内容。假设它使用标准网络字节顺序(大端)对数值进行编码,您将希望它转换为适用于 iOS 的正确字节顺序(我相信它始终是小端)。

我会这样处理:

uint16_t typeWithNetworkOrdering, typeWithLocalOrdering;
uint32_t sizeWithNetworkOrdering, sizeWithLocalOrdering;
char *cstring = NULL;
uint32_t numberWithNetworkOrdering, numberWithLocalOrdering;
const void *bytes = [myData bytes];
NSUInteger length = [myData length];

while (length > 0) {
memcpy(&typeWithNetworkOrdering, bytes, sizeof(uint16_t));
bytes += sizeof(uint16_t);
length -= sizeof(uint16_t);
memcpy(&sizeWithNetworkOrdering, bytes, sizeof(uint32_t));
bytes += sizeof(uint32_t);
length -= sizeof(uint32_t);
typeWithLocalOrdering = CFSwapInt16BigToHost(typeWithNetworkOrdering);
sizeWithLocalOrdering = CFSwapInt32BigToHost(sizeWithNetworkOrdering);

if (typeWithLocalOrdering == STRING_TYPE) { // STRING_TYPE is whatever type value corresponds to a string
cstring = (char *) malloc(sizeWithLocalOrdering + 1);
strncpy(cstring, bytes, sizeWithLocalOrdering);
cstring[sizeWithLocalOrdering] = '\0';
NSString *resultString = [NSString stringWithCString:cstring encoding:NSUTF8StringEncoding];
NSLog(@"String = %@", resultString);
free(cstring);
bytes += sizeWithLocalOrdering;
length -= sizeWithLocalOrdering;
// Do whatever you need to with the string
}
else if (typeWithLocalOrdering == NUMBER_TYPE) { // NUMBER_TYPE is whatever type value corresponds to a number
memcpy(&numberWithNetworkOrdering, bytes, sizeof(uint32_t));
numberWithLocalOrdering = CFSwapInt32BigToHost(numberWithNetworkOrdering);
NSLog(@"Number = %u", numberWithLocalOrdering);
bytes += sizeof(uint32_t);
length -= sizeof(uint32_t);
// Do whatever you need to with the number
}
}

关于iphone - 解析 NSData 对象以获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com