Как преобразовать NSData в массив байтов в iPhone?

Есть два значения для + операции. Первое значение - операция арифметического сложения между значениями нескольких чисел. Например,

System.out.println(1 + 2 + 5);  

Результат печати выше 9.
Второе значение - это String конкатенация между String и другими. Например,

System.out.println(9 + "=" + 9);  

Приведенный выше результат печати равен «9 = 9».
Я думаю, что вы можете напечатать коммутативный закон сложения. Следующее может быть тем, что вы хотите.

int a = 1, b = 3, c = 5;
System.out.println( (( a + b ) + c ) + "=" + ( a + ( b + c )) );
45
задан Yi Jiang 14 January 2011 в 08:06
поделиться

3 ответа

Вы не можете объявить массив с помощью переменной так 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, но менее расширяемо и более подвержено проблемам переполнения буфера, таким образом, я редко когда-либо использую его.

60
ответ дан Matt Gallagher 26 November 2019 в 20:56
поделиться

Подпись -[NSData bytes] - (const void *)bytes. Вы не можете присвоить указатель на массив на стеке. Если Вы хотите скопировать буфер, управляемый NSData объект в массив, использовать -[NSData getBytes:]. Если Вы хотите сделать это без копирования, то не выделяйте массив; просто объявите переменную указателя и позвольте NSData управляйте памятью для Вас.

9
ответ дан Nicholas Riley 26 November 2019 в 20:56
поделиться

Поэтому тип возврата для [байты данных] являются пустотой* массив c-стиля, не Uint8 (который является тем, какой Байт является определением типа для).

Ошибка состоит в том, потому что Вы пытаетесь установить выделенный массив, когда возврат является типом указателя, что Вы ищете, getBytes:length: звоните, который был бы похож:

[data getBytes:&byteData length:len];

Который заполняет массив, Вы выделили с данными из объекта NSData.

2
ответ дан Kendall Helmstetter Gelner 26 November 2019 в 20:56
поделиться