3

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

以下是涉及的两种方法:

视图控制器.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];
}

消息头.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;
}

控制台输出

查看确实加载了标题大小:3

消息头初始字节大小:4

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

我想知道它是否可能是方法之间uint8_t headerBytes[]和方法uint8_t *bytes中的演员init

如果有人对此有更多信息,那就太好了。谢谢

4

3 回答 3

4

sizeof是一个编译时运算符,不会做你认为它做的事情。

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

uint8_t* 上的 sizeof 为您提供指针的大小,在 32 位系统上为 4 个字节。

有关它的作用,请参阅wikipedia 文章sizeof

如果要传递数组的长度,一般的约定是传递一个额外的长度参数。由于您在目标 c 中工作,因此您应该传递一个 NSData,它可以包含数据数组及其大小。

于 2013-01-17T09:34:02.320 回答
1

bytes被声明为uint8_t *in initWithBytes,即指向 的指针uint_t

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

于 2013-01-17T09:30:00.983 回答
1

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

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

于 2013-01-17T09:32:18.303 回答