0

我正在尝试学习objective-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);
}

我的问题是辅助方法中的代码不会计算readFile方法计算的相同值。既然_data对象是相同的,为什么该方法计算不同的值?而且,如您所见,辅助方法内部的逻辑只是另一个的副本......

在其他语言(java)中,我通常在较小的方法中分离一些逻辑,以使代码模式可读/可维护。这就是为什么我试图用 ObjC 来模仿它。

当然,这可能会遗漏一些东西,但几个小时后,我放弃了。我不明白我的错误在哪里。也许我应该删除我的项目并重新开始......

TIA,

鲍勃

4

2 回答 2

3

%u用于打印 32 位无符号值。短是 16 位。因此,您正在打印解析后的值以及一些堆栈垃圾。

试试%huh修改以%u打印一个短值。


如果这不起作用:

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

有了这种错误,几乎可以保证要么您没有处理您认为的输入,要么您正在处理一些与数据类型相关的 C-ism 以及此类代码中的隐含转换。

即假设_data是一致的,那么它表明您认为正在工作的代码实际上并没有工作,而只是偶然出现

于 2012-07-02T19:57:55.900 回答
2

The problem is that you're passing a range of size 1 to getBytes:range:, but a short is 2 bytes in size. So getBytes:range: is only setting one of value's bytes, and the other contains random garbage.

If you really only want to get one byte from the data, change the type of value to int8_t. If you want to get two bytes, pass 2 as the second argument of NSMakeRange (and I recommend also changing the type of value to int16_t).

于 2012-07-02T21:32:12.213 回答