2012-04-02 15 views
6

私はNSDataオブジェクトを持っています。NSStringとしてNSDataを渡して戻す方法は?

文字列に変換し、関数に渡してからNSDataオブジェクトに戻したいと思います。

どのように?

このメソッドを試しましたが、NSDataの値は元のものとは異なります。

ここに私のコード:私は元のNSDataに変換することができますどのよう

// a generic class 
    APClass *c = [[APClass alloc] init]; 
    c.aNumber = 123; 
    c.aString = @"my string"; 

    // my data obj 
    NSMutableData *data = [NSMutableData data]; 

    // archiver to store class in nsdata 
    NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [encoder encodeObject:[NSNumber numberWithInt:c.aNumber] forKey:@"aNum"]; 
    [encoder encodeObject:c.aString forKey:@"aStr"]; 
    [encoder finishEncoding]; 
    [encoder release]; 

    [c release]; 

    NSLog(@"%@", data); 
    NSString *d = [NSString stringWithFormat:@"%@", data]; 

    // --- 

    NSString *strFromData = [NSString stringWithFormat:@"%@", d]; 

    NSData *dataNM = [strFromData dataUsingEncoding:NSUTF8StringEncoding]; 

    // decoder to retrieve class from nsdata  
    NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataNM]; 
    int number  = [[decoder decodeObjectForKey:@"aNum"] intValue]; 
    NSString *string = [decoder decodeObjectForKey:@"aStr"]; 
    [decoder finishDecoding]; 
    [decoder release]; 

    NSLog(@"[Number: %d] -- [String: %@]", number, string); 

データとデータのサイズが異なります。

2012-04-02 16:33:28.269 DataTest[18008:f803] -[__NSCFData objectForKey:]: unrecognized selector sent to instance 0x6b46c80

2012-04-02 16:33:28.270 DataTest[18008:f803] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData objectForKey:]: unrecognized selector sent to instance 0x6b46c80'

感謝: コンパイラはこのエラーを返して。

+0

NSData文字列値の作成で 'data'は何も設定されていませんが、空のNSMutableDataです。 NSStringからのNSDataの取得では、NSStringとは何ですか?より一般的には何を達成しようとしていますか? – zaph

+0

'[エンコーダfinishEncoding];'最初は空のデータ値を評価します。 'NSKeyedArchiver'を使って2つのアプリケーション間でクラス全体を渡す必要があります。はい、 'd'は前に作成された文字列です。 – elp

+0

なぜ 'NSString'に変換するのですか、単にNSData'として渡すのはなぜですか? – zaph

答えて

5

解決済み。

dataUsingEncodingを使用すると、NSDataの値は異なります。

メソッドやアプリケーションなどのデータを渡すために、私はbase64変換を使用しました。

エンコード

NSString *d = 
    [NSString stringWithFormat:@"appdue://obj=%@", 
    [APBase64Converter base64forData:data]]; 

デコード

NSData *data = [APBase64Converter base64DataFromString:urlParams]; 

APBase64Converter /デコード簡単にデータや文字列をエンコードlibです。

実施例とAPBase64Converter libには、こちらからダウンロードすることができます:http://goo.gl/8YNjS

感謝をすべて。

私は次の時間に人々と私を助けるためにこのポストを "保持"します!

+0

サードパーティのライブラリの代わりにAppleが提供する関数を使ってこれを行う方法はありますか? – Orchid

+0

私は知らない。私はすべてのプロジェクトで自分のlibを使います。 :) – elp

+0

よろしくお願いします。 Appleはこのライブラリを含むApp StoreにAppを受け入れたのですか、これは単なる個人的な脱獄のプロジェクトですか? – Orchid

0

使用
NSDataNSStringに:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

NSStringNSDataに:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding


NSUTF8StringEncoding
又は
NSMacOSRomanStringEncoding(WHIエンコーディングとchは8ビットエンコーディングです)。

+0

NSDataを格納するには 'NSKeyedArchiver'を使う必要があります。 'dataUsingEncoding'は既に使用されています。 'initWithData'が問題だと思いますか? – elp

-1

使用のBase64クラスには、これは私がイメージにデータとそのデータに文字列を変換する方法であるgithubの

 DatabaseResult* result = [self.database executeQuery:@"SELECT * FROM `images`  WHERE image_id = ? AND imagetype = ?", self.routeId,self.imagetype]; 

     for(EGODatabaseRow* row in result) { 

     NSString *strImage=[row stringForColumn:@"image_photo"]; 

     [Base64 initialize]; 

     NSData *data = [Base64 decode:strImage]; 

     UIImage *image=[UIImage imageWithData:data]; 

     } 

で利用可能です。

+0

DatabaseResultとは何ですか? EGODatabaseRow? Base64? – elp

+0

これは、データベースからbase64文字列を取得する方法です。 Base64について私は既に答えの先頭に言及しています。 – Arun

関連する問題