我正在努力学习目标-c。我正在尝试解析二进制文件,执行以下操作(简化):
@interface DatFile : NSObject {
NSData* _data;
}
-(id)initWithFilePath:(NSString *)filePath;
-(void) readFile;
-(void) auxiliaryMethod;
@implementation DatFile
- (id) initWithFilePath:(NSString *)filePath {
if ( self = [super init] ) {
_data = [NSData dataWithContentsOfFile:filePath];
}
return self;
}
-(void) readFile {
int header;
[_data getBytes: &header range: NSMakeRange(0, 4)];
NSLog(@"header: %u", header);
short key;
[_data getBytes: &key range: NSMakeRange(4, 2)];
NSLog(@"key: %u", key);
short value;
[_data getBytes: &value range: NSMakeRange(6, 1)];
NSLog(@"value: %u", value);
[self auxiliaryMethod];
}
-(void) auxiliaryMethod {
short value;
[_data getBytes: &value range: NSMakeRange(6, 1)];
NSLog(@"value: %u", value);
}
我的问题是 auxiliaryMethod 中的代码不会计算 readFile 方法计算的相同值。由于 _data 对象是相同的,为什么该方法计算不同的值?而且,正如您所看到的,auxiliaryMethod中的逻辑只是另一个的副本......
在其他语言(java)中,我通常在较小的方法中分离一些逻辑,以使代码模式可读/可维护。这就是为什么我试图用ObjC模仿它。
当然可能会遗漏一些东西,但几个小时后,我放弃了。我不知道我的错误在哪里。可能我应该删除我的项目并重新开始......
TIA,
鲍勃
答案 0 :(得分:3)
%u
适用于printing a 32 bit unsigned value。短路是16位。因此,您正在打印已解析的值以及一些堆栈垃圾。
尝试%hu
; h
修改%u
以打印短值。
如果不起作用:
有了这种错误,几乎可以保证你不是在处理你认为的输入,或者你正在处理与数据类型相关的一些C-ism以及这种隐含的转换代码。
即。假设_data
是一致的,那么它表示您认为正在运行的代码实际上并不起作用,而只是巧合地出现。
答案 1 :(得分:2)
问题在于您将大小为1的范围传递给getBytes:range:
,但是短的大小为2个字节。所以getBytes:range:
只设置value
个字节之一,另一个包含随机垃圾。
如果您真的只想从数据中获取一个字节,请将value
的类型更改为int8_t
。如果您想获得两个字节,请将2作为NSMakeRange
的第二个参数传递(我建议您还将value
的类型更改为int16_t
)。