#事の始まり
Int32データの配列が出力されているバイナリファイルをDataオブジェクトとして読み込んで、Swift上でInt32配列に置き換えて扱うお話。
これが思ったよりも一筋縄ではいかなかった。
#C言語だったら?
C言語だと以下のようなコードになると思います。
(コードを簡略化するために読み込みデータ長は1024でハードコードしています。)
int buf[1024];
FILE *fp = fopen("binary.dat", "r");
fread(buf, sizeof(int), 1024, fp);
fclose(fp)
#Swift4での実装方法
(Swift3でも同じ方法でいけるらしい?です。)
var buf:[Int32]? = nil
if let fileUrl:URL = Bundle.main.url(forResource: "binary", withExtension: "dat")
{
do
{
let dat:Data = try Data(contentsOf: fileUrl)
buf = dat.withUnsafeBytes{
Array(UnsafeBufferPointer<Int32>(start:$0, count:1024))
}
}
catch
{
buf = nil
}
}
C言語やObjective-Cで慣れていると、逆にややこしいですね。
Int32だけでなくFloatやInt16、Doubleでも多分同様でできると思います。
ただし、UInt8配列への変換はキャストすれば、オペレーターがやってくれるみたい。
let byteBuff:[UInt8] = [UInt8](dat)