在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是我的图像中应该有的像素总数。
答案 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]);
}