将NSData转换为int时出现问题

时间:2010-06-21 19:04:45

标签: objective-c nsdata

在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;
}

当二进制数据表示float或double时,这段代码(稍有更改)可以正常工作,但我不能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 :(得分:0)

返回指向局部变量的指针是非常糟糕的主意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]);
}