- - PR -
配列のポインタ操作
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-24 17:55
CやC++でいうと、byte配列を確保して、毎回ポインタを進めながらデータを格納していく
という処理をC#ではどのように記述すればよいのでしょうか? ソケットプログラミングを組んでいて、 byte [] rcvData = new byte[1024*768] に受信したデータを 保存していくのですが、既定の受信データ数になるまで受信を繰り返すときに Socket.Receive( バッファの先頭, ・・・)ですよね? そのバッファの先頭を求める記述が分からないんです。 C#ではポインタっていう考え方がないんですよね・・ よろしくお願い致します。 | ||||||||
|
投稿日時: 2004-02-24 19:20
諸農です。
Socket.GetStream()で取り出すことの出来るNetworkStreamクラスを使って、 Read()を行えば、バッファに使用しているバイト配列の指定位置から指定サ イズ分のデータを読み込むことが出来ます。 戻り値を確認することで、何バイト読み込まれたかの確認も出来ます。 見当違いでしたらご指摘ください。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2004-02-24 19:23
Socket.Receive メソッド (Byte[], Int32, Int32, SocketFlags) を使用すればよいのでは? | ||||||||
|
投稿日時: 2004-02-24 19:25
SocketクラスのReceive()メソッドの話ですか?
それなら、第一引数はバッファの先頭へのポインタではなくbyte型の配列オブジェクトへの参照です。 なので、rcvDataを渡せば良いと思います。 ------ あれ・・・私何か見当違いのこと書いてます? [ メッセージ編集済み 編集者: 一郎 編集日時 2004-02-24 19:29 ] | ||||||||
|
投稿日時: 2004-02-24 19:29
ないこともないですがってのはこの際置いといて… 基本的に.NET Frameworkの標準的なライブラリでポインタを求めるようなものはないはずです。「基本はポインタ」じゃないんですからあったら困りますよね。 > Socket.Receive( バッファの先頭, ・・・)ですよね? ちゃいます… CやC++とは異なり、C#での配列のような仮引数の記述は、ポインタではなく配列型の宣言です。これに引数を渡すには、配列型をそのまま渡します。 結果的にCなどと同じに見える「配列名」をいう記述になりますが。 | ||||||||
|
投稿日時: 2004-02-25 10:03
皆様、説明不足でした。
Socket通信で画像データを連続で何枚も受信し、その画像を連続でPictureBoxに 表示します。 1枚分の画像データ数は固定ですが、1回のRecieve()では受信できないと思い Recieve()を繰り返して1枚分のデータをためてから表示しようと思います。 最終的にはbyte[]にたまった画像データをMemoryStreamに展開して Bitmap型に保存してPictureBoxのImageへセットしようかと思っているのですが・・ string型のデータなら +(プラス)でデータを拡張していけますが この場合は1枚分の画像データをためていくには、どうすればよいのでしょうか? 以下はC++のソースです。C++ではメモリ領域確保してポインタを更新しながら データをためていました。1枚分のデータを表示し終わるとメモリの先頭に ポインタを戻して、受信を再開していました。 --C++のソースでは--- int m_nDibSize = sizeof( BITMAPINFO256 ) + 1024*768; HGLOBAL hDib = GlobalAlloc( GMEM_FIXED, m_nDibSize ); // DIB領域確保 Byte * p = (BYTE *)hDib; int nRcvCnt = 0; int iRcvd; // 画像データの受信 iRcvd = m_sConnectSocket.Receive ( p, m_nDibSize - nRcvCnt ); // エラーが発生していないか判定 if( iRcvd == SOCKET_ERROR ) { MessageBox("戻り値=SOCET_ERROR"); }else { nRcvCnt += iRcvd; // 受信データ合計計算 if( nRcvCnt < m_nDibSize) // DIB画像データ受信完了していないなら続けて受信待ち { p += iRcvd; return; } } // 1枚分の画像データを表示し、次画像データ受信へ・・ | ||||||||
|
投稿日時: 2004-02-25 10:59
VBのソースですが
----- Dim skt As Socket Dim buffer(2048) As Byte Dim offset As Integer = 0 Dim hr As Integer Do hr = skt.Receive(buffer, offset, 1, SocketFlags.None) If (hr <= 0) Then 'エラー Else offset += hr End If Loop While (offset <> buffer.Length) ------- こんなんでしょうか・・・ 超即興で書いてみたので合ってるか自信なし・・・・ [ メッセージ編集済み 編集者: kagura 編集日時 2004-02-25 11:00 ] | ||||||||
|
投稿日時: 2004-02-25 11:20
諸農です。
MemoryStreamに格納するのであれば、バイト配列にためる必要は無いと思います。 受信したバッファ(バイト配列)を、そのままMemoryStreamに書き込んでいけば OKだと思います。
_________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ |