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

您可能对指针进行了 truble 编码,请参见此处

“指针

您无法对指针进行编码并在解码时取回有用的东西。您必须对指针指向的信息进行编码。在非键控编码中也是如此。……”

于 2013-04-05T07:13:04.697 回答