【问题标题】:Problem while converting NSData to int将 NSData 转换为 int 时出现问题
【发布时间】:2010-06-21 19:04:45
【问题描述】:

在 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 changingNSSapBigIntToHostintoNSSwapLittleInttoHost`。我什至尝试了 long,但结果仍然相同,我得到了错误的值。我做错了什么?

PS:我的代码中的一些变量已经在我的程序的其他地方设置了。 BITPIX 是每个像素的位大小。在本例中为 32。GCOUNT 等于 1,PCOUNT 为 0,Nelements 是我应该在我的图像中拥有的像素总数。

【问题讨论】:

    标签: objective-c nsdata


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,您是对的,它看起来更干净。但小问题,您创建了一个大小为length 的数组,但实际上您只填充了数组的length/sizeof(int_32)case。你不应该这样做int32_t *array=malloc(length/sizeof(int_32));
    • @William,不,数组必须是 length 字节长。如果你划分,你最终会得到只有你需要的大小的 25% 的数组。我在那里展示的代码分配了length 字节,这是length/sizeof(int32_t) 整数的空间。
    • QUOTE :"返回指向局部变量的指针是一个非常糟糕的主意。"我同意。但是,我尝试了几件事,例如int (*array)[Nelements]; ... return *array;,但是编译器并不那么高兴。实际上,他对retrun array;also 并不满意。但是,在解决这个问题之前,我主要专注于尝试正确转换 NSdata。
    • @William,在我的示例代码中调用malloc 将解决所有这些问题。
    • 是的,没错,malloc分配给数组的字节大小,而不是数组的元素个数。感谢您的建议。我会更新我的代码。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 2021-01-27
    • 2013-06-16
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多