2016-12-27 11 views
0

私は、私のソースコードで現在使用しているアンマネージコードを取り除こうとしています。しかし、私はこことそこにいくつかの問題に直面しているようだ。ほとんどの場合、Buffer.BlockCopy()が最も適切な方法であるように見えましたが、何を使用するのかまだわからないものがいくつかあります。ポインタとアンマネージコードを取り除くこと

基本的に、これは、サーバーとクライアントの間で送信されるパケットを処理するために使用されます。 WriteInt16は、たとえば、バイト配列にushort値を書き込むために使用される関数です。 (1.基本的にオフセット20と22でこれをやっています)。リトルエンディアンのプラットフォームとバイトと仮定すると

1.

fixed (byte* p = Data) 
{ 
    *((ushort*)(p + 20)) = X;//x is an ushort 
    *((ushort*)(p + 22)) = Y;//y is an ushort 
} 

2.

private byte* Ptr 
    { 
     get 
     { 
      fixed (byte* p = PData) 
       return p; 
     } 
    } 

3.

public unsafe void WriteInt16(ushort val) 
    { 
     try 
     { 
      *((ushort*)(Ptr + Count)) = val; 
      Count += 2; 
     } 
     catch{} 
    } 
+1

のですか?サイドノート:私はあなたの友人が、あなたが使用しなければならないキーワード '安全でない 'からそれを実現するのではなく、安全ではないことをあなたに伝えた。 – itsme86

+0

キーワードでは安全ではないことがわかっていましたが、なぜ私は安全でないコードとその意味を使用してはならない理由を説明してくれました – Noobzilla

+1

コードは何をすべきですか?目的が何であるかがはっきりしないときに代替案を提案するのは難しいです。 –

答えて

0

私は以下のカップルの例を残しておきますアレイ(テストされていない):

*((ushort*)(p + 20)) = X; 

Data[20] = (byte)X; 
Data[21] = (byte)(X >> 8); 

*((ushort*)(Ptr + Count)) = val; 

であるあなたは、このデータが表すものは何でものための強力なタイプを使用していないのはなぜ

PData[Count] = (byte)val; 
PData[Count + 1] = (byte)(val >> 8); 
関連する問題