gpt4 book ai didi

ios - Mac 和 iOS 之间的 NSData 结构

转载 作者:行者123 更新时间:2023-11-29 04:01:19 26 4
gpt4 key购买 nike

我已经研究这个问题有一段时间了,我有一个在 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);
}

我没有得到正确的数据。有趣的是,如果我在 Mac 上运行 initWithContents 方法并读取其中的文件,它似乎没问题。

所以我认为 iphone/mac 处理文件系统的方式有所不同......我尝试使用 NSKeyedArchiver 对数据进行编码,但我收到一个异常说明“无法理解的文件......”

最佳答案

对于“对象”结构,您必须分别存储“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];

关于ios - Mac 和 iOS 之间的 NSData 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15827567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com