2012-02-24 4 views
0

현재이 NSData 객체를 생성 중입니다. NSString 및 UInt32 유형의 다른 개체를 넣고 싶습니다. 내 NSData 객체에 NSString을 두는 방법을 알고 있지만 UInt32 스칼라 유형으로이 작업을 수행하는 방법을 알지 못합니다. UInt32 스칼라 유형을 NSData 객체로 인코딩하는 방법

내가 그것을 어떻게하는있는 NSString

그래서, 대신 다른 사람이이 질문에 대한 답변이되었다고 볼 수 있도록 그냥 대답에 넣어 것입니다 내 질문에 업데이트하는 그것을 알아 낸
- (void) constructRequest 
{ 
    NSString *mystring = [[NSString alloc] initWithString:[self addMethodName]]; 
    UInt32 protocolInt = [self addProtocolVersion]; 

    NSData* data=[mystring dataUsingEncoding:NSUTF8StringEncoding]; 
    [data writeToFile:@"/Users/imac/Desktop/_dataDump.dat" atomically:YES]; 

} 

답변

3

그들이 비슷한 것을하려고한다면. 그것은을 NSData해야합니까

- (void) constructRequest 
{ 
    //NSString *mystring = [[NSString alloc] initWithString:[self addMethodName]]; 
    UInt32 protocolInt = [self addProt]; 

    NSData * data = [[NSData alloc] initWithBytes:&protocolInt length:sizeof(protocolInt)]; 

    //NSData* data=[mystring dataUsingEncoding:NSUTF8StringEncoding]; 
    [data writeToFile:@"/Users/imac/Desktop/_dataDump.dat" atomically:YES]; 

} 
+2

그렇게하지 마십시오. 엔디안 - 안전하지 않습니다 (PowerPC Mac과 Intel Mac은 다르게 읽을 것입니다.) –

+0

hrmm. 그렇다면 어떻게하면 엔디안 - 안전하게 만들 수 있습니까? 현재 big-endian으로 만들려고 노력 중입니다. 결과를 내 바탕 화면의 .dat 폴더에 출력하고 결과를 확인하기 위해 HexEdit을 사용하여 열었습니다. 현재 빅 엔디안으로 읽는 중입니다. 이것을 안전하게 할 수 있습니다. –

+2

'CFSwapInt32HostToBig()'또는'CFSwapInt32HostToLittle()'을 사용하여 알려진 순서로 바이트 스왑한다. 이것을 읽을 때 결과 정수를'CFSwapInt32BigToHost()'또는'CFSwapInt32LittleToHost()'를 적절히 사용하여 네이티브 순서로 바꾼다. –

1

을 다음과 같이

코드는? NSString 또는 NSNumber (둘 다 속성 목록에 저장할 수 있음)를 사용할 수 있습니다.

4 바이트 문자열과 UInt32를 구분하지 않습니다.

+0

각 속성의 시작 부분에 선도적 인 Uint16 번호를 추가 할 계획입니다. 서버가 reciver 클래스의 각 섹션을 처리 할 수있는 서버를 만듭니다. 그게 네가 언급 한 것인가? 유일한 문제는 여러 개의 NSData 구조를 만드는 방법에 대한 확신이 없다는 것입니다. 현재이를 조사하고 있습니다. –

+0

NSData는 단지 데이터입니다. 그러나 당신이하고 싶다고 말한 것은 다른 물건을 구하는 것이 었습니다. NSData에 집중하는 대신 객체 (NSString 및 NSNumber)를 속성 목록 (NSDictionary)의 키 값으로 저장하십시오. –

0

htonl(), htons(), ntohl()ntohs()을 사용하면 엔디안에 안전 할 수 있습니다.

htonl()--"Host to Network Long int"  32Bytes 
ntohl()--"Network to Host Long int"  32Bytes 
htons()--"Host to Network Short int" 16Bytes 
ntohs()--"Network to Host Short int" 16Bytes 

예 :

- (void)testExample { 

UInt32 length = 0x1a2b3c4d; 
NSLog(@"%x", length); 
length = htonl(length); 
NSLog(@"%x", length); 
NSMutableData *data = [[NSMutableData alloc] init]; 
[data appendBytes:&length length:4]; 
NSLog(@"%@", data); 

} 

인쇄 :

2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] 1a2b3c4d 
2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] 4d3c2b1a 
2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] <1a2b3c4d> 
관련 문제