2013-11-04 5 views
5

C#で以下の状況を処理する最善の方法は何ですか?C#Array.ValueはC++で作成された配列と異なります

私はC/C++で書かれたサーバーアプリケーションを持っています。

たとえば、 unsigned charバッファー(長さは256)を作成します。 このバッファには、クライアントが送信するデータが格納されます。格納後、受信したバッファには暗号検査がいくつかあります。

私はこのサーバーのクライアントをC#で書いています。

問題は、私は暗号化チェックが失敗しているコンテンツ256の全長とbyte[]アレイを作成する場合、サーバは256

の固定長で期待されるバッファです。

私が知った理由は簡単です。サーバーは、256バイトのバッファーが必要です。例えば、メッセージが"Hello World"である場合、残りのバッファは0パディングされなければならない。 または、説明してください:バイトは(unsigned) "204"または(signed) "-52"である必要があります。

これはC/C++の概念の問題/問題だと思います。

私の問題を解決するために、私はその値を明示的に設定しています。

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = new byte[len]; 
    for(int i = 0; i < len; i++) 
     if(i < data.Length) 
      tmp[i] = data[i]; 
     else 
      tmp[i] = 204; 
    return tmp; 
} 

これらのアートに期待されるバイトを使用するより良い方法はありますか?私は何か不可欠なものを見ていないのですか?

+0

バイト配列を特定の値にデフォルトのnull以外の_Initializeにこの[回答](http://stackoverflow.com/a/6150310/2145211)に基づいて?_私はあなたのソリューションは良いと言うでしょう。 – Harrison

+0

私はさらに一般化して "ブランク"の値を渡すので、値が204以外の値であれば、再利用することができます。 –

答えて

2

あなたのコード内ifが気に入らない場合、あなたはLINQを試すことができます。

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = Enumerable.Repeat((byte)204, len).ToArray(); 
    for(int i = 0; i < data.Length; i++) 
    { 
     tmp[i] = data[i]; 
    } 

    return ret; 
} 

しかし、概念的に、それは同じですが、ちょうど(間違いなく)ビットすてきに見えます。

+0

ループをZipに置き換えて、ToArrayをリターンに配置することもできます。 – Magus

1

アレイ全体を目的の塗りつぶし文字に「memset」してから実際のデータを挿入できますか?

+1

これは読みやすい結果のように聞こえるでしょう。さらに、 'Buffer.BlockCopy'それをクリアする。 –

+0

アイデアを指定できますか? pinvokeオーバーヘッドなしでmemsetを実装する方法は?実際には、私はすでにBlockCopyをtrye'dしていました。しかし、0以上の要素は満たされていません。要素が処理されるとき、サーバー側で邪魔になります。 – OnkelM

+0

あなたの投稿は次のように述べています。「私はC/C++で書かれたサーバーアプリケーションを持っています ...長さ256の符号なしcharバッファを作成します。だから私はそれがC/C++であると仮定し、配列が作成されたときにそれを行う必要がありました。 –

関連する問題