2013-01-17 58 views
2

我有一個奇怪的問題與obj c通過uint8_t數組添加額外的字節。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; 
} 

控制檯輸出

查看做負載報頭長度:3

消息頭的init字節大小:4

這是很奇怪!將字節輸出到屏幕上會顯示額外的字節已被添加到數據中,原因不明。如果eef231是輸入,那麼eef23150是init方法中的輸出。該額外的字節看起來是隨機的。

我不知道它是否可能是uint8_t headerBytes[]uint8_t *bytes之間的init方法。

如果有人有任何更多的信息,這將是偉大的。謝謝

回答

3

sizeof是一個編譯時操作符,不會做你認爲它的工作。

sizeof on uint8_t []給出了該數組的大小,即1個字節* 3個元素= 3個字節。它可以這樣做,因爲數組聲明具有附加的隱式大小信息。

sizeof on uint8_t *給你一個指針的大小,它是32位系統上的4個字節。

請參閱wikipedia articlesizeof瞭解其功能。

如果你想傳遞數組的長度,一般約定是傳遞一個額外的長度參數。既然你在使用目標c,你應該傳遞一個NSData,它可以包含一個數據數組,也可以包含它的大小。

1

bytesinitWithBytes中被聲明爲uint8_t *,也就是指向uint_t的指針。

指針的大小在硬件的情況下爲4個字節。它與數組大小無關,這在該方法內部是未知的。

+1

正確的感謝。所以接下來的問題是,我怎樣才能傳遞一個'uint8_t'數組而不是一個指針?或者我不能? –

1

問題出在initWithBytes:sizeof(bytes)爲您提供指針變量的大小,32位體系結構上的4個字節。

沒有辦法在被調用函數中獲取原始C數組的大小(在運行時C數組不包含大小信息)。您需要將尺寸作爲附加參數傳遞。

+0

啊謝謝!說得通。有沒有辦法傳遞原始C數組而不是指針?或者我做得對嗎? –