2009-11-05 3 views
3

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 *dataNSUInteger offset을 선언합니다.

이 코드가 맞습니까? 걱정해야 할 것이 있습니까? 아직 실제 장치에서 (시뮬레이터에서만) 테스트하지 않았으므로 나에게 잘 작동하는 것 같습니다. 그것에 대해 의견이 있으십니까?

감사합니다.

답변

2

코드가 다소 정확 해 보입니다.

어려운 방법처럼 보입니다.

HTTP 서버에서 되돌아 오는 데이터가 실제로는 원시 바이트라는 사실에 놀라지는 않습니다. 놀랍습니다. 예외적으로 드물지만 서버의 디자인이 거의 틀림없이 틀린 경우가 있습니다. (바이너리 -HTTP- 응답이 올바른 대답 인 경우는 확실하지만 매우 드뭅니다.)

데이터에서 수십만 개의 값을 말하는 것이 아니라면 HTTP에 의해 암시 된 오버 헤드가 거의 확실하게 바이너리로가는 이득을 능가 할 것입니다. 문자열에서 알려진 숫자 값을 파싱하면 번거롭지 않다. HTTP를 사용하면 정말 매력적이지 않을 것이다.


서버 디자인 : 충분히 정교합니다. 퍼즐을 다루는 또 다른 타당한 이유는 퍼즐의 특정 부분을 변경할 수 없기 때문입니다.

저는 개인적으로 수비 코드를 구현하는 것이 :

  • 가 로컬 데이터 크기가 놀라움을 방지하기 위해 원격/네트워크 크기에 비해 예상 크기의 것을 확인 (이 초기화 또는에서 주장 될 수있다 일부 디버그 코드 - 나는 이런 상황에서 방어적인 자세를 선호한다.)

  • if/else if/else if/else 시퀀스 대신 case 문을 사용하십시오. 완전히 미적인 결정이지만 ...

  • ... length과의 거래는 로깅으로 인해 예상치 못한 디버그 모드 일지라도 예상치 못한 값입니다. 예기치 않은 값의 크기가 전반적인 정확성에 잠재적으로 매우 나쁜 것이라고 생각합니까?

+0

이것은 RESTful API이며 실제로 수백 개의 값 (문자열 및 숫자)이 포함 된 콜렉션에 응답합니다. 결과물은 gzip으로되어있어 나에게 의미가있다. 나는 서버를 실제로 디자인하지 않았으며 변경되지 않을 것이므로 구현이 올바른 것처럼 더 걱정됩니다. 그렇게 할 수있는 더 좋은 방법이 있다고 생각합니까? 감사! – leolobato

+0

팁 주셔서 감사합니다! 바이트 배열을 nsnumber로 변환하는 방법에 대해 실제로 염려 했었지만, 그 부분을 언급하지 않았으므로 올바른 (또는 적어도 유효한 방법) 것처럼 보입니다. :) – leolobato