我有一个奇怪的问题,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 *bytes
和init
之间的广告。
如果有人有任何更多的信息,这将是伟大的。感谢
答案 0 :(得分:4)
sizeof
是一个编译时运算符,不会按照您的想法执行操作。
sizeof给出了该数组的大小,即1个字节* 3个元素= 3个字节。它可以这样做,因为数组声明附加了隐式大小信息。
uint8_t *上的sizeof给出了指针的大小,在32位系统上是4个字节。
请参阅sizeof
上的wikipedia article,了解它的作用。
如果要传递数组的长度,通常的惯例是传递一个额外的长度参数。由于你在目标c中工作,你应该传递一个NSData,它可以包含一个数据数组,以及它的大小。
答案 1 :(得分:1)
bytes
在uint8_t *
中声明为initWithBytes
,即指向uint_t
的指针。
对于您的硬件,指针的大小为4个字节。它与数组大小无关,这在该方法中是未知的。
答案 2 :(得分:1)
问题在于initWithBytes:
:sizeof(bytes)
给出了指针变量的大小,32位架构上的4个字节。
无法在被调用函数中获取原始C数组的大小(在运行时C数组不包含大小信息)。您需要将大小作为附加参数传递。