2015年9月19日土曜日

NSDataの内容をC的に変更する方法

NSDataは基本的には一度初期化するとその内容を変更することはできない。変更する場合はNSMutableDataを使うと。少なくともメソッドを使った方法ではその通りなのだが、C的に変更するなら方法がある。

NSMutableData *mdata〜
char *p=(char  *)[mdata mutableBytes];  

NSData *data=〜
char *p=(char  *)[data bytes];

とすると、内容を示すポインターを得られる。
ここでpのアドレスからに改変を加えるとNS(Mutable)Dataの内容が変わる。Mutableでなくてもいける。

NS(Mutable)Dataの中ではデータは連続した領域に保存されているようである。

ここ1つ注意すべきは、この方法で内容を更新するときは、絶対に元のデータの範囲を超えないこと。メソッドによるアクセスとは違い安全機構は働かないので確実にシステムが落ちる。

そしてもう1つ。この方法で書き換えても効果が出ないこともある。

AVAudioPlayerは内部でのデータの保持にNSDataを使っている。それは

AVAudioPlayer *av=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
char *p=[av.data bytes];

でアクセスできるが、ここでpからの内容を書き換えても音は変化しない。おそらくは、元の音声データが.dataにあるが、実際に音声出力用データはinitWith時に別に複製が作られているのではないかと思う。

確保した音声データを直接書き換え音を変更しようと思った実験の結果。

0 件のコメント:

コメントを投稿