2017年1月16日月曜日

NSDataとNSStringとbyte列??

NSURLSessionでjsonで取得したデータは"NSData"型で、byte data(のようなもの)のようです。
NSJSONSerializationでjsonの要素を取得したい場合はそのままNSDataを渡してあげれば良いのですが、
ちょっと加工したい場合はNSStringで処理を行うのが良さそうです。
NSData -> NSString -> NSData
という感じになります(これが最適なのかはわかりませんが...NSJSONSerializationに渡すNSDataに余計な文字があるとerrorになる事があったので、NSStringで適当に修正しようかという用途です)

今回のテストコードはデータを作る都合で(横着して) String -> NSData -> NSString -> 文字加工 の順になっていますが、
思っていた動作にはなっているようです。

byte配列でアクセスする場合はArray<Int8>でポインタのようにしてアクセスすると良い模様です。

NSDataに含まれる"()"を削除する例
//: Playground - noun: a place where people can play

import UIKit

var str = "(Hello)";

// String -> NSData
let data = str.dataUsingEncoding(NSUTF8StringEncoding)

// NSData -> NSString
let str2 = NSString(data:data!, encoding:NSUTF8StringEncoding)

// NSStringの文字列処理
var str3 = str2?.stringByReplacingOccurrencesOfString("(", withString: "")
str3 = str3?.stringByReplacingOccurrencesOfString(")", withString: "")
print(str3) // Helloと表示される...これを再度NSData化すればJSON処理できそう

// NSDataをbyte列として扱う
var buffer = Array<Int8>(count: data!.length, repeatedValue: 0)
data!.getBytes(&buffer, length: data!.length) // &でポインタ扱い
for byte in buffer {
    // print("\(byte)")
    let str = NSString(format:"%2X", byte)  // 16進文字列変換
    print(str)
}

0 件のコメント:

コメントを投稿