在方法之间向uint8_t数组添加字节?

时间:2013-01-17 09:26:45

标签: objective-c bytearray byte

我有一个奇怪的问题,obj c通过uint8_t数组添加一个额外的字节。

以下是涉及的两种方法:

ViewController.m

- (void)viewDidLoad {
    // hexData = NSData object
    const uint8_t *hexBytes = [hexData bytes];

    // header is first 3 bytes
    uint8_t headerBytes[] = {hexBytes[0],hexBytes[1],hexBytes[2]};

    // output the size
    NSLog(@"View did load header size: %lu", sizeof(headerBytes));

    // create a MessageHeader object
    MessageHeader *messageHeader = [[MessageHeader alloc] initWithBytes:headerBytes];
}

MessageHeader.h

- (id)initWithBytes:(uint8_t *)bytes {
    self = [super init];
    if(self != nil){
        NSLog(@"Message header init bytes size: %lu", sizeof(bytes));
        NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
        self.bytes = bytes;
    }
    return self;
}

控制台输出

  

View确实加载了标题大小:3

     

消息头init字节大小:4

这很奇怪!将字节输出到屏幕显示,没有明显原因将额外字节附加到数据。如果eef231是输入,那么eef23150是init方法中的输出。额外的字节似乎是随机的。

我想知道它是否可能是uint8_t headerBytes[]方法中uint8_t *bytesinit之间的广告。

如果有人有任何更多的信息,这将是伟大的。感谢

3 个答案:

答案 0 :(得分:4)

sizeof是一个编译时运算符,不会按照您的想法执行操作。

uint8_t []上的

sizeof给出了该数组的大小,即1个字节* 3个元素= 3个字节。它可以这样做,因为数组声明附加了隐式大小信息。

uint8_t *上的

sizeof给出了指针的大小,在32位系统上是4个字节。

请参阅sizeof上的wikipedia article,了解它的作用。

如果要传递数组的长度,通常的惯例是传递一个额外的长度参数。由于你在目标c中工作,你应该传递一个NSData,它可以包含一个数据数组,以及它的大小。

答案 1 :(得分:1)

bytesuint8_t *中声明为initWithBytes,即指向uint_t的指针。

对于您的硬件,指针的大小为4个字节。它与数组大小无关,这在该方法中是未知的。

答案 2 :(得分:1)

问题在于initWithBytes:sizeof(bytes)给出了指针变量的大小,32位架构上的4个字节。

无法在被调用函数中获取原始C数组的大小(在运行时C数组不包含大小信息)。您需要将大小作为附加参数传递。