FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


符号なしcharと浮動小数点数を持つバイナリファイルをObjective-Cで保存しPythonで読み込む

浮動小数点数を持つバイナリファイルをPythonで読み込む
↑この続き、というか変化球というか。

macOSアプリ(Objective-C)で機械学習のデータセットを作成する時に入力と正解ラベルをセットにして1ファイルにするとなにかと都合がいい(いろんなケースがあるだろうけど、自分の場合は)。
ということで、macOSアプリ側で画像データ(unsinged char)の後に正解ラベル(float値)を付けて一つのバイナリファイルとし、それをPython側で読めるようにしたい。
今回はそういうことが可能か確認した。

最初に5個のunsigned char値を入れ、その後に5個のfloat値があるとし、そのバイナリファイルを扱う。

まずmacOSアプリ側で作成し、保存する。
{
    // unsigned char値の作成
    NSUInteger nofCData = 5;
    unsigned char *cData = calloc(nofCData, sizeof(unsigned char));
    for (NSUInteger ite=0; ite<nofCData; ite++) {
        cData[ite] = ite*10;
    }
    for (NSUInteger ite=0; ite<nofCData; ite++) { // チェック
        NSLog(@"data[%ld] = %hhu",ite,cData[ite]);
    }
    // float値の作成
    NSUInteger nofFData = 5;
    float *fData = calloc(nofFData , sizeof(float));
    for (NSUInteger ite=0; ite<nofFData; ite++) {
        fData[ite] = (float)ite/10.0;
    }
    for (NSUInteger ite=0; ite<nofFData; ite++) { // チェック
        NSLog(@"data[%ld] = %f",ite,fData[ite]);
    }
    

    // 保存
    NSString *filePath = …
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager createFileAtPath:filePath contents:[NSData data] attributes:nil];//カラを新作
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];

    NSData *nsCData=[NSData dataWithBytes:cData length:nofCData*sizeof(unsigned char)];
    [fileHandle writeData:nsCData];
    
    NSData *nsFData=[NSData dataWithBytes:fData length:nofFData*sizeof(float)];
    [fileHandle writeData:nsFData];

    [fileHandle synchronizeFile];
    [fileHandle closeFile];
}
↑コードはこんな感じで、NSFileHandle使って順番にunsigned char値を保存し、次にfloat値を保存する。
あらかじめ
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
でカラのファイルを作成しておく必要がある。でないと落ちないけどファイルができない。
{
    //これだとダメ
    NSData *nsCData=[NSData dataWithBytes:cData length:nofCData*sizeof(unsigned char)];
    [nsCData writeToFile:filePath atomically:YES];
    NSData *nsFData=[NSData dataWithBytes:fData length:nofFData*sizeof(float)];
    [nsFData writeToFile:filePath atomically:YES];
}
↑なお、このように以前と同じようなNSDataの
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
メソッドで保存すると後の方しか保存されないのでダメ。

macOSアプリ側での実行結果

↑チェックした値の確認。

作成・保存したファイルの情報

↑計算通り 1バイトx5個 + 4バイトx5個 = 25バイトのファイルができた。


次にPython側でこのファイルを読み込む。
{
    fid = open(FilePath, "rb")
    for ite in range(5) :
        r = struct.unpack('B', fid.read(1))
        print("data[%d]=%d"%(ite,r[0]))
    for ite in range(5) :
        r = struct.unpack('f', fid.read(4))
        print("data[%d]=%f"%(ite,r[0]))
}
↑こちらもopenしたファイルを順番に読み込んだらいけた。

読み込んだ結果

↑実行後の結果。めでたし、めでたし。


(参考)
Objective-cでファイル書き込み - 備忘録 〜プログラミング〜

<< NSTableViewに置いたNSPopUpButton等の変化時にどの行のボタンなのか得る  TopPage  MacでPHPを動かす時のメモ >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1232-109e8cc6




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad