如何将NSData转换为iPhone中的字节数组?

我想将NSData转换为一个字节数组,所以我写了下面的代码:

 NSData *data = [NSData dataWithContentsOfFile:filePath]; int len = [data length]; Byte byteData[len]; byteData = [data bytes]; 

但最后一行代码popup一个错误,说“赋值中的不兼容types”。 那么将数据转换为字节数组的正确方法是什么?

你不能用一个variables来声明一个数组,所以Byte byteData[len]; 将无法工作。 如果你想从一个指针复制数据,你还需要memcpy(它会经过指针所指向的数据并将每个字节复制到指定的长度)。

尝试:

 NSData *data = [NSData dataWithContentsOfFile:filePath]; NSUInteger len = [data length]; Byte *byteData = (Byte*)malloc(len); memcpy(byteData, [data bytes], len); 

这段代码会dynamic地将数组分配给正确的大小(当你完成的时候你必须free(byteData) ),并将字节复制到它。

如果你想使用固定长度的数组,你也可以使用getBytes:length:如其他人指出的那样。 这避免了malloc / free,但扩展性较差,更容易发生缓冲区溢出问题,所以我很less使用它。

你也可以使用它们所在的字节,把它们转换成你需要的types。

 unsigned char *bytePtr = (unsigned char *)[data bytes]; 

已经回答了,但总结来帮助其他读者:

  //Here: NSData * fileData; uint8_t * bytePtr = (uint8_t * )[fileData bytes]; // Here, For getting individual bytes from fileData, uint8_t is used. // You may choose any other data type per your need, eg. uint16, int32, char, uchar, ... . // Make sure, fileData has atleast number of bytes that a single byte chunk would need. eg. for int32, fileData length must be > 4 bytes. Makes sense ? // Now, if you want to access whole data (fileData) as an array of uint8_t NSInteger totalData = [fileData length] / sizeof(uint8_t); for (int i = 0 ; i < totalData; i ++) { NSLog(@"data byte chunk : %x", bytePtr[i]); } 

-[NSData bytes]的签名是- (const void *)bytes 。 您不能将指针指定给堆栈上的数组。 如果你想复制由NSData对象pipe理的缓冲区到数组中,使用-[NSData getBytes:] 。 如果你想不做复制,那么不要分配一个数组。 只是声明一个指针variables,让NSData为你pipe理内存。

这是因为[data bytes]的返回types是void * c-style数组,而不是Uint8(这是Byte是typedef的)。

错误是因为你正试图设置一个分配的数组,当返回是一个指针types时,你要找的是getBytes:length:call,它看起来像这样:

 [data getBytes:&byteData length:len]; 

其中填充你分配的数据从NSData对象的数组。