等方法不会计算相同的值

时间:2012-07-02 19:35:04

标签: objective-c

我正在努力学习目标-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,

鲍勃

2 个答案:

答案 0 :(得分:3)

%u适用于printing a 32 bit unsigned value。短路是16位。因此,您正在打印已解析的值以及一些堆栈垃圾。

尝试%hu; h修改%u以打印短值。


如果不起作用:

  • 确保两种方法之间的数据对象相同 (不要看他们怎么不能......但是......)
  • 显示实际打印值
  • 解码为无符号长整数,在解码之前显式初始化为0

有了这种错误,几乎可以保证你不是在处理你认为的输入,或者你正在处理与数据类型相关的一些C-ism以及这种隐含的转换代码。

即。假设_data是一致的,那么它表示您认为正在运行的代码实际上并不起作用,而只是巧合地出现

答案 1 :(得分:2)

问题在于您将大小为1的范围传递给getBytes:range:,但是短的大小为2个字节。所以getBytes:range:只设置value个字节之一,另一个包含随机垃圾。

如果您真的只想从数据中获取一个字节,请将value的类型更改为int8_t。如果您想获得两个字节,请将2作为NSMakeRange的第二个参数传递(我建议您还将value的类型更改为int16_t)。