私はObj-Cとcocoaの新しいプログラマーです。バイナリ ファイル (通常、天文学者が使用するFlexible Image Transport SystemまたはFITSバイナリ ファイル)を読み取るために使用されるフレームワークを作成しようとしています。抽出したいバイナリ データにはさまざまな形式があり、FITSファイルのヘッダーを読み取ってそのプロパティを取得します。
これまでのところ、FITSファイルのコンテンツを格納するクラスを作成し、ヘッダーをNSString
オブジェクトに分離し、バイナリ データをオブジェクトに分離することができましたNSData
。また、バイナリ データを解釈するのに非常に価値のあるキー値をヘッダーから抽出できるメソッドを作成することもできました。
私は今、NSData
オブジェクトをプリミティブ配列 (、、double
...の配列)int
に変換しようとしています。short
しかし、ここで行き詰まり、助けていただければ幸いです。
FITSファイルに関するドキュメントによると、BITPIX
キーの値に応じてバイナリ データを解釈する 5 つの可能性があります。
BITPIX value | Data represented
8 | Char or unsigned binary int
16 | 16-bit two's complement binary integer
32 | 32-bit two's complement binary integer
64 | 64-bit two's complement binary integer
-32 | IEEE single precision floating-point
-64 | IEEE double precision floating-point
NSData
をプリミティブ配列に変換するために、以下に示す平和なコードを既に作成しています。
// self reefer to my FITS class which contain a NSString object
// with the content of the header and a NSData object with the binary data.
-(void*) GetArray
{
switch (BITPIX)
{
case 8:
return [self GetArrayOfUInt];
break;
case 16:
return [self GetArrayOfInt];
break;
case 32:
return [self GetArrayOfLongInt];
break;
case 64:
return [self GetArrayOfLongLong];
break;
case -32:
return [self GetArrayOfFloat];
break;
case -64:
return [self GetArrayOfDouble];
break;
default:
return NULL;
}
}
// then I show you the method to convert the NSData into a primitive array.
// I restrict my example to the case of 'double'. Code is similar for other methods
// just change double by 'unsigned int' (BITPIX 8), 'short' (BITPIX 16)
// 'int' (BITPIX 32) 'long lon' (BITPIX 64), 'float' (BITPIX -32).
-(double*) GetArrayOfDouble
{
int Nelements=[self NPIXEL]; // Metod to extract, from the header
// the number of element into the array
NSLog(@"TOTAL NUMBER OF ELEMENTS [%i]\n",Nelements);
//CREATE THE ARRAY
double (*array)[Nelements];
// Get the total number of bits in the binary data
int Nbit = abs(BITPIX)*GCOUNT*(PCOUNT + Nelements); // GCOUNT and PCOUNT are defined
// into the header
NSLog(@"TOTAL NUMBER OF BIT [%i]\n",Nbit);
int i=0;
//FILL THE ARRAY
double Value;
for(int bit=0; bit < Nbit; bit+=sizeof(double))
{
[Img getBytes:&Value range:NSMakeRange(bit,sizeof(double))];
NSLog(@"[%i]:(%u)%.8G\n",i,bit,Value);
(*array)[i]=Value;
i++;
}
return (*array);
}
ただし、ループで出力する値は、期待される値とは大きく異なります (公式の FITS ソフトウェアを使用した場合と比較して)。したがって、 Obj-Cは IEEE-754規則をdouble
使用しておらず、 Obj-Cは2 の補数ではないと思います。私はこの 2 つの規則 ( IEEEとtwos-complement ) に精通していないため、 Obj-Cでこの変換を行う方法を知りたいと考えています。 int
ヘルプや情報をお寄せいただきありがとうございます。