Проблема при преобразовании NSData в int - PullRequest
0 голосов
/ 21 июня 2010

Используя основу и какао-фреймворки на Mac, я пытаюсь преобразовать объект NSData в понятное человеку число.Допустим, объект NSData является изображением NPIXEL.Я знаю, что двоичные данные кодируются с прямым порядком байтов и представляют 32-разрядное целое число (точнее 32-разрядное целое число с двумя дополнениями).Я пишу фрагмент кода ниже, чтобы преобразовать NSData в массив int.Но полученное мной значение совершенно неверно (это не значит, что измерения плохие, я использовал специальное программное обеспечение для считывания данных, и значение, данное программным обеспечением, отличается от того, которое я получил с моим кодом).

-(int *) GetArrayOfLongInt
{
  //Get the total number of element into the Array
  int Nelements=[self NPIXEL];
  //CREATE THE ARRAY
  int array[Nelements];
  //FILL THE ARRAY
  int32_t intValue;
  int32_t swappedValue;
  double Value;
  int Nbit = abs(BITPIX)*GCOUNT*(PCOUNT + Nelements); Nbit/=sizeof(int32_t);
  int i=0;
  int step=sizeof(int32_t);
  for(int bit=0; bit < Nbit; bit+=step)
  {
    [Img getBytes:&swappedValue range:NSMakeRange(bit,step)];
    intValue= NSSwapBigIntToHost(swappedValue);
    array[i]=intValue;
    i++;
  }
  return array;
}

Этот фрагмент кода (с незначительными изменениями) отлично работает, когда двоичные данные представляют собой числа с плавающей или двойной точностью, но я не надеваю t when it is 16,32 or 64 bit integer. I also tried changing NSSapBigIntToHost into NSSwapLittleInttoHost`.Я даже пытался долго, но результаты все те же, я получил плохие значения.Что я делаю неправильно?

PS: некоторые переменные в моем коде уже установлены в другом месте моей программы.BITPIX - размер в битах каждого пикселя.В данном случае 32. GCOUNT равно 1, PCOUNT 0, а Nelements - это общее количество пикселей, которое я должен иметь на своем изображении.

1 Ответ

0 голосов
/ 21 июня 2010

Возвращение указателя на локальную переменную очень плохая идея .array может быть перезаписано в любое время (или, если вы будете писать через указатель, вы можете испортить стек).Вы, вероятно, хотите что-то вроде:

// CREATE THE ARRAY
int *array = malloc(Nelements * sizeof(int));

Ваш алгоритм тоже кажется немного излишним.Почему бы просто не скопировать весь массив из объекта NSData, а затем поменять байты на месте?Что-то вроде:

int32_t length = [Img length];
int32_t *array = malloc(length);

[Img getBytes:array length:length];

for (i = 0; i < length/sizeof(int32_t); i++)
{
    array[i] = NSSwapBigIntToHost(array[i]);
}
...