如何NSData的转换为字节数组的iPhone?
-
05-09-2019 - |
题
欲NSData
转换为一个字节数组,所以我写的以下代码:
NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];
但最后一行代码弹出一个错误说:“在分配不兼容的类型”。 什么是将数据以字节数组转换的正确方法呢?
解决方案
可以不使用可变所以Byte byteData[len];
将不起作用声明一个数组。如果希望将数据从一个指针复制,则还需要与memcpy(其将经过所述数据所指向的指针和每一个字节起来复制到指定的长度)。
尝试:
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
这个代码将动态分配的阵列到正确大小(必须free(byteData)
当你完成)和字节复制到它。
您还可以,如果你想使用固定长度的数组使用getBytes:length:
他人指示。这避免的malloc /免费,但延展性较低,更容易,所以我很少会用它来缓存溢出的问题。
其他提示
您也可以只使用他们在哪里字节,他们铸造你所需要的类型。
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
对象管理的缓冲区拷贝到阵列中使用-[NSData getBytes:]
。如果你想这样做而不进行复制,然后不分配数组;只是声明指针变量,并让NSData
管理存储器为您服务。
这是因为对[数据字节]返回类型是一个void * c样式阵列,而不是一个UINT8(这是字节为一个typedef)。
这个错误是因为你试图当返回为指针类型来设置分配的数组,你正在寻找的是的getBytes:长度:调用哪个看起来像:
[data getBytes:&byteData length:len];
填充已与来自NSData对象数据分配的阵列。
这就是我认为这是斯威夫特等价的:
if let data = NSData(contentsOfFile: filePath) {
let length = data.length
let byteData = malloc(length)
memcmp(byteData, data.bytes, length)
}
不隶属于 StackOverflow