NSDataからStringへの変換:徹底解説!エンコード、Base64、16進文字列、SQLite連携
iPhone/iOS/SQLite における NSData から String への変換
iPhone/iOS アプリ開発において、データベースとのデータやり取りでは、しばしば NSData
型と NSString
型の相互変換が必要になります。本記事では、NSData
型を NSString
型に変換する方法について、3 つの代表的な方法とそれぞれの特徴、注意点、コード例を分かりやすく解説します。
stringWithEncoding: メソッド
最もシンプルで汎用性の高い方法です。NSData
オブジェクトに含まれるバイト列を、指定された文字エンコーディングに基づいて NSString
オブジェクトに変換します。
コード例:
// UTF-8 エンコーディングで変換
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// ASCII エンコーディングで変換
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
注意点:
- 使用する文字エンコーディングを明示的に指定する必要があります。データの内容とエンコーディングが一致していない場合、文字化けが発生する可能性があります。
- エンコーディングによっては、変換できない文字が存在する可能性があります。
base64EncodedStringWithOptions: メソッド
NSData
オブジェクトを Base64 エンコードされた文字列に変換します。Base64 エンコードは、バイナリデータをテキスト形式に変換する可逆変換です。
NSString *str = [data base64EncodedStringWithOptions:0];
- Base64 エンコードされた文字列は、元のデータよりも長くなります。
- デコード処理が必要となる場合、処理コストがかかります。
hexadecimalString メソッド
NSData
オブジェクトを 16 進文字列に変換します。16 進文字列は、バイナリデータを可読形式で表現する方法の一つです。
NSString *str = [data hexadecimalString];
- 16 進文字列は、人間にとって読みづらい形式です。
SQLite とのデータやり取りにおいて、NSData
型と NSString
型の相互変換が必要となる場面はいくつかあります。
- BLOB 型データの保存・読み込み:
SQLite の BLOB
型は、バイナリデータを格納するために使用されます。NSData
型のデータを BLOB
型カラムに保存するには、dataUsingEncoding:
メソッドで NSString
型に変換してから、sqlite3_bind_text()
関数を使用してバインドする必要があります。読み込み時には、sqlite3_column_text()
関数で取得した const char *
型のデータを NSData
型に変換する必要があります。
- テキスト型データの暗号化:
セキュリティ上の理由から、パスワードなどのテキストデータを暗号化して保存したい場合があります。この場合、NSData
型の暗号化データを NSString
型に変換して、TEXT
型カラムに保存することができます。
NSData
型と NSString
型の相互変換には、いくつか方法があります。それぞれの特徴と注意点、コード例を理解した上で、目的に合った方法を選択することが重要です。
// UTF-8 エンコーディングで変換
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// エンコーディング指定なし (デフォルトは UTF-8)
NSString *str = [[NSString alloc] initWithData:data];
// エラー処理
NSError *error;
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding error:&error];
if (error) {
// エラー処理
}
NSString *str = [data base64EncodedStringWithOptions:0];
// 改行文字を挿入しない
NSString *str = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSString *str = [data hexadecimalString];
// 小文字で出力
NSString *str = [data hexadecimalStringWithOptions:NSDataBase64EncodingLowercase];
SQLite との連携
// BLOB 型データの保存
sqlite3_stmt *stmt;
const char *sql = "INSERT INTO table (column) VALUES (?)";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_blob(stmt, 1, data.bytes, data.length, NULL);
sqlite3_step(stmt);
// BLOB 型データの読み込み
sqlite3_stmt *stmt;
const char *sql = "SELECT column FROM table";
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_step(stmt);
const void *blobData = sqlite3_column_blob(stmt, 0);
int blobLength = sqlite3_column_bytes(stmt, 0);
NSData *data = [NSData dataWithBytes:blobData length:blobLength];
// テキスト型データの暗号化
NSData *encryptedData = [data AES256EncryptWithKey:key];
NSString *str = [encryptedData base64EncodedStringWithOptions:0];
// テキスト型データの復号化
NSData *decryptedData = [[NSData alloc] initWithBase64EncodedString:str options:0];
NSData *data = [decryptedData AES256DecryptWithKey:key];
その他
- 上記のコード例は、基本的な使用方法を示しています。実際の使用状況に合わせて、コードを修正する必要があります。
- エラー処理やメモリ管理など、安全なコーディングを実践する必要があります。
NSData から String への変換方法:その他の方法
-[NSData componentsSeparatedByBytesUsingDelimiter:] メソッド
指定された区切り文字でバイト列を分割し、NSString
型の配列を生成します。
NSData *data = ...;
NSString *delimiter = @",";
NSArray *components = [data componentsSeparatedByBytesUsingDelimiter:[delimiter dataUsingEncoding:NSUTF8StringEncoding]];
// 各要素は NSString 型
for (NSString *component in components) {
// ...
}
-[NSData rangeOfData:options:] メソッド
指定されたデータパターンが NSData
オブジェクト内に存在するかどうかを調べ、存在する場合はその位置と長さを返します。
NSData *data = ...;
NSData *pattern = ...;
NSRange range = [data rangeOfData:pattern options:NSDataSearchBackwards];
if (range.location != NSNotFound) {
// パターンが見つかった
// ...
}
-[NSData subdataWithRange:] メソッド
指定された範囲のバイト列を抽出し、新しい NSData
オブジェクトを生成します。
NSData *data = ...;
NSRange range = NSMakeRange(10, 20);
NSData *subdata = [data subdataWithRange:range];
C 言語関数
NSData
オブジェクトのバイト列を直接操作する C 言語関数を使用することもできます。
const char *bytes = [data bytes];
size_t length = [data length];
// ...
NSString *str = [[NSString alloc] initWithBytes:bytes length:length encoding:NSUTF8StringEncoding];
注意事項
これらの方法は、上記で紹介した 3 つの方法よりも複雑で、使用頻度も低くなります。使用する場合は、それぞれの方法の特徴と注意点をよく理解する必要があります。
iphone ios sqlite