0

私はしばらくこの問題に取り組んできました.Macでアプリを実行しています.次のような構造体に座標データが保存されています.

struct xyz {
  float x;
  float y;
  float z;
};

struct xy {
  float x;
  float y;
};

struct object {
  struct xyz *myXYZ;
  struct xy *myXY;
};

NSDataこれはすべて期待どおりに機能し、構造体を次のように追加します。

struct object anInitialTestStruct;
NSMutableData *myTestDataOut = [NSMutableData dataWithBytes:&anInitialTestStruct length:64 freeWhenDone:NO];
BOOL good = [myTestDataOut writeToFile:[NSString stringWithFormat:@"%@/filename.dat", docsDirectory] atomically:YES];

これは期待どおりに機能し、ファイルを取得し、その中にデータがあるように見えます (参照用に、anInitialTestStruct にポインターと malloc を使用しましたが、それでも目的の結果が得られません)。

iPhone で、ファイルをプロジェクトにコピーし、次のようにします。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"dat"];
NSData *myVecNSData = [[NSData alloc] initWithContentsOfFile:filePath options:NSDataReadingUncached error:&error];
if ( error ) {
    NSLog(@"%@", error);
}

正しいデータが返ってきません。興味深いことにinitWithContents、Mac でメソッドを実行してそこにあるファイルを読み取ると、問題ないように見えます。

だから私はiPhone / Macでファイルシステムを扱う方法が違うと思っています....を使用してデータをエンコードしようとしましたNSKeyedArchiverが、「理解できないアーカイブ.....」という例外が発生します.

4

2 に答える 2

1

「オブジェクト」構造の場合、「xy」と「xyz」構造を別々に、たとえば辞書に保存する必要があります。

    struct object anInitialTestStruct;
    NSDictionary *structureDataAsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSMutableData dataWithBytes:anInitialTestStruct.myXY length:sizeof(xy)], @"xy key",
                                     [NSMutableData dataWithBytes:anInitialTestStruct.myXYZ length:sizeof(xyz)], @"xyz key",
                                     nil];
    NSData *myTestDataOut = [NSKeyedArchiver archivedDataWithRootObject:structureDataAsDictionary];
    BOOL good = [myTestDataOut writeToFile:[NSString stringWithFormat:@"%@/filename.dat", docsDirectory] atomically:YES];

デコードは次のようなものです。

    struct object anInitialTestStruct;
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"dat"];
    NSData *myVecNSData = [[NSData alloc] initWithContentsOfFile:filePath options:NSDataReadingUncached error:&error];
    if ( error ) {
        NSLog(@"%@", error);
    }
    // retrieving dictionary from NSData
    NSDictionary *structureDataAsDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:myVecNSData];
    // allocating memory for myXY and myXYZ fields
    anInitialTestStruct.myXY = (xy*)malloc(sizeof(xy));
    if (anInitialTestStruct.myXY == NULL) {
        // error handling
    }
    anInitialTestStruct.myXYZ = (xyz*)malloc(sizeof(xyz));
    if (anInitialTestStruct.myXYZ == NULL) {
        // error handling
    }
    // filling myXY and myXYZ fields with read data
    [[structureDataAsDictionary objectForKey:@"xy key"] getBytes:anInitialTestStruct.myXY];
    [[structureDataAsDictionary objectForKey:@"xyz key"] getBytes:anInitialTestStruct.myXYZ];
于 2013-12-02T10:05:24.797 に答える
0

ポインターのエンコードに問題がある可能性がありますここを参照してください

「ポインタ

ポインターをエンコードして、デコード時に有用なものを取得することはできません。ポインターが指している情報をエンコードする必要があります。これは、非キー化コーディングにも当てはまります。...」

于 2013-04-05T07:13:04.697 に答える