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

如何在iPhone中将NSData转换为字节数组?,iphone,objective-c,bytearray,type-conversion,Iphone,Objective C,Bytearray,Type Conversion,我想将NSData转换为字节数组,因此我编写以下代码: NSData *data = [NSData dataWithContentsOfFile:filePath]; int len = [data length]; Byte byteData[len]; byteData = [data bytes]; 但最后一行代码会弹出一个错误,称为“赋值中的不兼容类型”。 那么,将数据转换为字节数组的正确方法是什么?的签名是-[NSData bytes]的-(const void*)字节。无法将指针

我想将
NSData
转换为字节数组,因此我编写以下代码:

NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];
但最后一行代码会弹出一个错误,称为“赋值中的不兼容类型”。
那么,将数据转换为字节数组的正确方法是什么?

的签名是
-[NSData bytes]
-(const void*)字节。无法将指针分配给堆栈上的数组。如果要将由
NSData
对象管理的缓冲区复制到数组中,请使用
-[NSData getBytes:][/code>。如果不想复制,就不要分配数组;只需声明一个指针变量,并让NSData为您管理内存。

这是因为[data bytes]的返回类型是void*c样式的数组,而不是Uint8(字节是typedef的对象)

错误是因为当返回为指针类型时,您试图设置分配的数组,您要查找的是getBytes:length:调用,该调用类似于:

[data getBytes:&byteData length:len];

它用NSData对象中的数据填充已分配的数组。

不能使用变量来声明数组,因此
字节字节数据[len]不起作用。如果要从指针复制数据,还需要memcpy(它将遍历指针指向的数据,并将每个字节复制到指定的长度)

尝试:

此代码将动态地将数组分配到正确的大小(完成后必须
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*fileData;
uint8_t*bytePtr=(uint8_t*)[fileData字节];
//这里,为了从文件数据中获取单个字节,使用uint8\t。
//您可以根据需要选择任何其他数据类型,例如uint16、int32、char、uchar等。
//确保fileData至少具有单个字节块所需的字节数。例如,对于int32,文件数据长度必须大于4字节。有道理吗?
//现在,如果您想以uint8\u t数组的形式访问整个数据(fileData)
NSInteger totalData=[fileData length]/sizeof(uint8\u t);
对于(int i=0;i
以下是我认为的Swift等价物:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}

在我添加[data getBytes:byteData length:len]之后;byteData结果是无效的。可能是什么问题?尝试打印NSData并查看是否匹配;然后检查长度,确保它看起来像你期望的那样。如果数据是字符串,也可以尝试-[NSString stringWithContentsOfFile]。我发现了问题:长度不应该是变量。它应该是Byte byteData[255];最近Java对我来说太多了。:-)很高兴你弄明白了。字节数据无效。可能是什么问题?@ChillyZhong尝试指定字节数据大小,例如
uint8\u t*cipherBuffer[16]
,然后删除
&
和NSLog(@“%s”,char*)字节数据);字节byteData=malloc(len);弹出一条警告:“初始化使整型从指针无需强制转换”。byteData是一个字节变量,而不是字节数组。有什么想法吗?代码中有一个小的输入错误,现在应该可以按照马特的意图工作了。是的。memcpy的第二个参数应该是[data bytes]。@matt Gallagher:它工作正常,但这种转换会造成一些延迟。如何减少。。。任何想法?????
Byte byteData[len]
都将适用于Clang和GCC。这是有效的C(C支持可变长度数组),因此也是有效的Objective-C;
if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}