49

我想转换NSData为字节数组,所以我写了以下代码:

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

但是最后一行代码弹出一个错误,说“分配中的类型不兼容”。那么将数据转换为字节数组的正确方法是什么?

4

6 回答 6

62

您不能使用变量声明数组,因此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,但扩展性较差,更容易出现缓冲区溢出问题,所以我很少使用它。

于 2009-04-07T06:39:04.717 回答
43

您也可以只使用它们所在的字节,将它们转换为您需要的类型。

unsigned char *bytePtr = (unsigned char *)[data bytes];
于 2010-12-03T20:09:26.870 回答
16

已经回答,但概括一下以帮助其他读者:

    //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]);
    }
于 2014-04-21T19:03:48.340 回答
10

的签名-[NSData bytes]- (const void *)bytes。您不能将指针分配给堆栈上的数组。如果要将NSData对象管理的缓冲区复制到数组中,请使用-[NSData getBytes:]. 如果您想在不复制的情况下进行操作,则不要分配数组;只需声明一个指针变量并让NSData您管理内存。

于 2009-04-07T04:05:41.077 回答
2

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

错误是因为您试图在返回是指针类型时设置分配的数组,您正在寻找的是 getBytes:length: 调用,它看起来像:

[data getBytes:&byteData length:len];

它用来自 NSData 对象的数据填充您分配的数组。

于 2009-04-07T04:07:03.677 回答
0

这是我认为的 Swift 等价物:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
于 2018-02-01T16:51:07.760 回答