2012-02-24 7 views
0

現在このNSDataオブジェクトを作成しています。 NSStringとUInt32型の異なるオブジェクトを入れたいと思います。 NSStringをNSDataオブジェクトに入れる方法はわかっていますが、UInt32スカラー型でこれを行う方法はわかりません。NSntオブジェクトにUInt32スカラー型をエンコードする方法

これは私がだから私はそれを考え出した、と他の人がこの質問が回答されていることを見ることができるようにだけではなく、私の質問を更新するので、私は答えに入れます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

でそれを行う方法です彼らが何か似たようなことをしているのならば。

- (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。だから私はそれをエンディアンセーフにする方法は?私はそれをビッグエンディアンにしようとしています。デスクトップの.datフォルダに結果を出力し、結果を確認するためにHexEditで開きました。現在、ビッグエンディアンとして読み込んでいます。これを安全にすることができます。 –

+2

'CFSwapInt32HostToBig()'または 'CFSwapInt32HostToLittle()'を使用して、それを既知の順序にバイトスワップします。それを読み込む際には、結果の整数を 'CFSwapInt32BigToHost()'や 'CFSwapInt32LittleToHost()'で適宜ネイティブ順序に戻してください。 –

1

を次のように

コードがある、それはNSDataのである必要がありますか。 NSStringまたはNSNumber(どちらもプロパティリストに保存できます)を使用できます。

あなたのスキームは、4バイト文字列とUInt32を区別しません。

+0

私は各プロパティの先頭に先行するUint16番号を追加する予定です。サーバが受信者クラスの各セクションを扱うことができるようにする。それはあなたが指していたものですか?唯一の問題は、いくつかのうち1つの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> 
関連する問題