Objective-C (및 C 자체)에 익숙하지 않아서 HTTP 출력에서 NSData
을 사용해야합니다. byte 배열로 작업 해본 적이 없거나 little/big endian 문제에 대해 걱정해야만했습니다. NSData
에서 지정된 길이의 NSNumber
을 읽으려면 다음과 같은 메서드를 작성하는 데 다소 어려움을 겪었습니다.NSData에서 NSNumber를 읽으십시오.
- (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 *data
및 NSUInteger offset
을 선언합니다.
이 코드가 맞습니까? 걱정해야 할 것이 있습니까? 아직 실제 장치에서 (시뮬레이터에서만) 테스트하지 않았으므로 나에게 잘 작동하는 것 같습니다. 그것에 대해 의견이 있으십니까?
감사합니다.
이것은 RESTful API이며 실제로 수백 개의 값 (문자열 및 숫자)이 포함 된 콜렉션에 응답합니다. 결과물은 gzip으로되어있어 나에게 의미가있다. 나는 서버를 실제로 디자인하지 않았으며 변경되지 않을 것이므로 구현이 올바른 것처럼 더 걱정됩니다. 그렇게 할 수있는 더 좋은 방법이 있다고 생각합니까? 감사! – leolobato
팁 주셔서 감사합니다! 바이트 배열을 nsnumber로 변환하는 방법에 대해 실제로 염려 했었지만, 그 부분을 언급하지 않았으므로 올바른 (또는 적어도 유효한 방법) 것처럼 보입니다. :) – leolobato