我想将 NSData
转换为字节数组,因此我编写了以下代码:
NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];
但是最后一行代码弹出一个错误,显示“赋值时类型不兼容”。那么将数据转换为字节数组的正确方法是什么?
我想将 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/free,但可扩展性较差且更容易发生缓冲区溢出问题,因此我很少使用它。
你也可以直接使用它们所在的字节,将它们转换为您需要的类型。
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
为你管理内存即可。[data getBytes:&byteData length:len];
这将使用NSData对象中的数据填充您已分配的数组。
uint8_t *cipherBuffer[16]
,然后删除&
并使用NSLog(@"%s", (char *)byteData); - Mazen Kasser以下是我认为等价于Swift的内容:
if let data = NSData(contentsOfFile: filePath) {
let length = data.length
let byteData = malloc(length)
memcmp(byteData, data.bytes, length)
}
Byte byteData[len]
可以在 Clang 和 GCC 中使用。这是有效的 C 语言(C 支持可变长度数组),因此也是有效的 Objective-C 语言。 - zneak