Pergunta

Eu quero converter NSData para um array de bytes, então eu escrever o seguinte código:

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

Mas a última linha de código aparece um erro dizendo "tipos incompatíveis na atribuição". Qual é a maneira correta de converter os dados para o array de bytes, então?

Foi útil?

Solução

Você não pode declarar uma matriz usando uma variável tão Byte byteData[len]; não vai funcionar. Se você deseja copiar os dados de um ponteiro, você também precisa memcpy (que irá percorrer os dados apontados pelo ponteiro e copiar cada byte até um comprimento especificado).

Tente:

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

Este código irá alocar dinamicamente a matriz para o tamanho correto (você deve free(byteData) quando estiver pronto) e copiar os bytes para ele.

Você também pode usar getBytes:length: como indicado por outros, se você quiser usar uma matriz de comprimento fixo. Isso evita malloc / livre, mas é menos extensível e mais propenso a tampão problemas de sobrecarga, então eu raramente usá-lo.

Outras dicas

Você também pode apenas usar os bytes onde eles estão, lançando-os para o tipo que você precisa.

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

Já respondeu, mas generalizar para ajudar outros leitores:

    //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]);
    }

A assinatura do -[NSData bytes] é - (const void *)bytes. Você não pode atribuir um ponteiro para uma matriz na pilha. Se você deseja copiar o buffer gerido pelo objeto NSData para a matriz, use -[NSData getBytes:]. Se você quiser fazê-lo sem copiar, então não alocar uma matriz; apenas declarar uma variável ponteiro e deixe NSData gerenciar a memória para você.

Isso porque o tipo de retorno para [Dados bytes] é uma matriz void * c-estilo, não um Uint8 (que é o Byte é um typedef para).

O erro é porque você está tentando definir uma matriz alocada quando o retorno é um tipo de ponteiro, o que você está procurando é o getBytes: Comprimento: convite, que seria parecido com:

[data getBytes:&byteData length:len];

O que enche a matriz tenha atribuído com dados do objeto NSData.

Aqui está o que eu acredito é o equivalente Swift:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top