2012-01-17 8 views
4

fixed()文で作成されたポインタの型を何とかキャストできますか?固定長intポインタへのC#バイト配列

これは状況です:

私は、このようにint型*の代わりに、バイト*を持つ、しかし、私はintとして処理されるべき値をしたいと思い、私は反復処理したいバイトの配列を、持っています。ここで

は、いくつかの典型的なコードです:

byte[] rawdata = new byte[1024]; 

fixed(int* ptr = rawdata) //this fails with an implicit cast error 
{ 
    for(int i = idx; i < rawdata.Length; i++) 
    { 
     //do some work here 
    } 
} 

は、これは、反復内のキャストを行うことなく、行うことができますか?

+2

なぜC#でポインタを使用したいのですか?これを反復するには 'for'ループを使います。 –

+0

合意。最初からあなたの意図を追加することは、回答を提供し、質問を避けるのに役立ちます:) – Timo

答えて

4
byte[] rawdata = new byte[1024]; 

fixed(byte* bptr = rawdata) 
{ 
    int* ptr=(int*)bptr; 
    for(int i = idx; i < rawdata.Length; i++) 
    { 
     //do some work here 
    } 
} 
+0

はい、ありがとうございます。もちろん。 – WhiteN01se

+0

あなたは実際にあなたのポインタを移動していない、おそらくそれを示すために良いアイデアだろう。バイトサイズの違いについても言及する必要があります。 – Guvante

5

私はあなたがbyte*経由を行かなければならないと考えています。たとえば、次の繰り返し処理を行う場合、あなたは32ビット値のシーケンスとして、あなたのバイト配列を処理している場合、あなたはrawData.Length/4、ないrawData.Lengthを使用する必要があること

using System; 

class Test 
{ 
    unsafe static void Main() 
    { 
     byte[] rawData = new byte[1024]; 
     rawData[0] = 1; 
     rawData[1] = 2; 

     fixed (byte* bytePtr = rawData) 
     { 
      int* intPtr = (int*) bytePtr; 
      Console.WriteLine(intPtr[0]); // Prints 513 on my box 
     } 
    } 
} 

は注意してください。

+0

はい、あなたは正しいと思います.Length/4。 – WhiteN01se

+0

'sizeof(int)'に均等に分割されないポインタ算術を使って残りのバイトを処理する最良の方法は何ですか? (例えば、バイト配列の長さが1023バイトの場合) –

+0

@QuickJoeSmith:基本的にはポインタ演算ではない*を扱います。 –

2

私が見つけた - 一見 - これを行うための、よりエレガントで何らかの理由でもより高速な方法: - 離れて正しい反復長さを設定するから - 増分である私がする必要がある唯一の事は

 byte[] rawData = new byte[1024]; 
     GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned); 
     int* iPtr = (int*)rawDataHandle.AddrOfPinnedObject().ToPointer(); 
     int length = rawData.Length/sizeof (int); 

     for (int idx = 0; idx < length; idx++, iPtr++) 
     { 
      (*iPtr) = idx; 
      Console.WriteLine("Value of integer at pointer position: {0}", (*iPtr)); 
     } 
     rawDataHandle.Free(); 

をこのようにポインタ。私はfixedステートメントを使ったコードとコードを比較しましたが、これは少し速いです。

関連する問題