gpt4 book ai didi

iphone - 从 NSData 读取 NSNumber

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:41 24 4
gpt4 key购买 nike

我是 Objective-C(和 C 本身)的新手,需要从 HTTP 输出中使用 NSData。我从来没有真正使用过字节数组或者不得不担心小/大端问题,并且在编写以下方法来读取 NSNumber 中的指定长度时遇到了一些困难 NSData.

- (NSNumber *)readNumberWithLength:(NSUInteger)length
{
Byte k[length];
[data getBytes:k range:NSMakeRange(offset, length)]; // big endian byte array representing a number
offset += length;

NSNumber *number;
if (length==4) {
number = [NSNumber numberWithUnsignedInt:CFSwapInt32BigToHost(*(uint32_t *)k)];
} else if (length==2) {
number = [NSNumber numberWithUnsignedShort:CFSwapInt16BigToHost(*(uint16_t *)k)];
} else if (length==1) {
number = [NSNumber numberWithUnsignedChar:*(uint8_t *)k];
} else if (length==8) {
number = [NSNumber numberWithUnsignedLongLong:CFSwapInt64BigToHost(*(uint64_t *)k)];
} else {
number = [NSNumber numberWithInt:0];
}

return number;
}

我将 NSData *dataNSUInteger offset 声明为实例变量。

这段代码是否正确?有什么我应该担心的吗?我还没有在实际设备上测试过它(仅在模拟器上),它似乎对我来说工作正常。您对此有何评论?

谢谢!

最佳答案

代码看起来或多或少是正确的。

似乎很难。

我会感到惊讶——不是完全震惊,而是惊讶——从 HTTP 服务器返回的数据实际上只是原始字节。这种情况极为罕见,如果出现这种情况,则服务器的设计几乎肯定是错误的。 (当然在某些情况下二进制 HTTP 响应是正确的答案,但这种情况非常罕见)。

除非您谈论的是数据中成百上千的值,否则 HTTP 隐含的开销几乎肯定会超过二进制的任何 yield 。从字符串中解析已知数值并不难,除非您确实经常这样做(这首先会使使用 HTTP 变得不是特别有吸引力)。


服务器设计:足够公平。处理它的另一个正当理由是因为您无法更改拼图的特定部分。

我个人会更具防御性地实现代码:

  • 验证本地数据大小与远程/网络大小相比是否符合预期大小以防止出现意外(这可能是初始化断言或某些调试代码中的断言——我更喜欢在这种情况下采取 super 防御措施).

  • 使用 case 语句代替 if/else if/else if/else 序列。完全是一个审美决定,但它会有助于……

  • ... 通过记录处理作为意外值的length,即使仅在 Debug模式下也是如此。我认为意外的值大小可能对整体正确性非常不利?

关于iphone - 从 NSData 读取 NSNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682415/

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