- PR -

配列のポインタ操作

投稿者投稿内容
ヨンジュン
常連さん
会議室デビュー日: 2003/09/29
投稿数: 22
投稿日時: 2004-02-24 17:55
CやC++でいうと、byte配列を確保して、毎回ポインタを進めながらデータを格納していく
という処理をC#ではどのように記述すればよいのでしょうか?
ソケットプログラミングを組んでいて、
byte [] rcvData = new byte[1024*768] に受信したデータを
保存していくのですが、既定の受信データ数になるまで受信を繰り返すときに
Socket.Receive( バッファの先頭, ・・・)ですよね?
そのバッファの先頭を求める記述が分からないんです。

C#ではポインタっていう考え方がないんですよね・・
よろしくお願い致します。

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-24 19:20
諸農です。

Socket.GetStream()で取り出すことの出来るNetworkStreamクラスを使って、
Read()を行えば、バッファに使用しているバイト配列の指定位置から指定サ
イズ分のデータを読み込むことが出来ます。
戻り値を確認することで、何バイト読み込まれたかの確認も出来ます。

見当違いでしたらご指摘ください。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-24 19:23
引用:

ヨンジュンさんの書き込み (2004-02-24 17:55) より:
CやC++でいうと、byte配列を確保して、毎回ポインタを進めながらデータを格納していく
という処理をC#ではどのように記述すればよいのでしょうか?
ソケットプログラミングを組んでいて、
byte [] rcvData = new byte[1024*768] に受信したデータを
保存していくのですが、既定の受信データ数になるまで受信を繰り返すときに
Socket.Receive( バッファの先頭, ・・・)ですよね?
そのバッファの先頭を求める記述が分からないんです。



Socket.Receive メソッド (Byte[], Int32, Int32, SocketFlags)
を使用すればよいのでは?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-02-24 19:25
SocketクラスのReceive()メソッドの話ですか?
それなら、第一引数はバッファの先頭へのポインタではなくbyte型の配列オブジェクトへの参照です。
なので、rcvDataを渡せば良いと思います。

------
あれ・・・私何か見当違いのこと書いてます?

[ メッセージ編集済み 編集者: 一郎 編集日時 2004-02-24 19:29 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-02-24 19:29
引用:

ヨンジュンさんの書き込み (2004-02-24 17:55) より:
byte [] rcvData = new byte[1024*768] に受信したデータを
保存していくのですが、既定の受信データ数になるまで受信を繰り返すときに
Socket.Receive( バッファの先頭, ・・・)ですよね?
そのバッファの先頭を求める記述が分からないんです。

C#ではポインタっていう考え方がないんですよね・・


ないこともないですがってのはこの際置いといて…
基本的に.NET Frameworkの標準的なライブラリでポインタを求めるようなものはないはずです。「基本はポインタ」じゃないんですからあったら困りますよね。

> Socket.Receive( バッファの先頭, ・・・)ですよね?
ちゃいます…
CやC++とは異なり、C#での配列のような仮引数の記述は、ポインタではなく配列型の宣言です。これに引数を渡すには、配列型をそのまま渡します。
結果的にCなどと同じに見える「配列名」をいう記述になりますが。
ヨンジュン
常連さん
会議室デビュー日: 2003/09/29
投稿数: 22
投稿日時: 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枚分の画像データを表示し、次画像データ受信へ・・



kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 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 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-25 11:20
諸農です。

引用:

1枚分の画像データ数は固定ですが、1回のRecieve()では受信できないと思い
Recieve()を繰り返して1枚分のデータをためてから表示しようと思います。
最終的にはbyte[]にたまった画像データをMemoryStreamに展開して



MemoryStreamに格納するのであれば、バイト配列にためる必要は無いと思います。
受信したバッファ(バイト配列)を、そのままMemoryStreamに書き込んでいけば
OKだと思います。

コード:
byte[] buf = new byte[1024];
MemoryStream ms = new MemoryStream();

while (受信完了まで) {
  int ret = soc.Reacive(buf);
  ms.Write(buf,0,ret);
}

Bitmap bm = new Bitmap(ms);

//以降、ビットマップクラスを利用する処理



_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)