タイトル一覧   関連タグ: Win C#
タグ:Win C# タイトル:バッファのコピー
1
1:  お名前:celica 2004/12/19 3:40:46

こんにちは。
C#をはじめたばかりなのですが、いきなり困ってます。。。
C#で構造体のバッファをbyte型の配列にコピーするにはどうしたらいいのですか?
例えば
struct buffer
{
  uint aaa ;
  uint bbb ;
}
buffer BUF ;

byte [] sndMsg = new byte [1024] ;
こんな感じの時に、BUFの内容をsedMsgにコピーしたいのです。

なぜこんな事をする必要があるのかと言うと、Socketで構造体の内容をメッセージとして送信したいのです。
sendするにはbyte型の配列にする必要があるようなので。。。

どうかよろしくおねがいします。
2:  お名前:doronjo 2004/12/19 7:42:23

http://www.ailight.jp/BBS/Detail.aspx?Header_ID=1205
この内容参考になりませんか?
3:  お名前:celia 2004/12/19 14:16:28

教えていただいたスレッドを見たところ、
StructureToPtrと言うのがあったので、

System.IntPtr iptr ;
int bufsize ;
bufsize = System.Runtime.InteropServices.Marshal.SizeOf(BUF) ;
iptr = System.Runtime.InteropServices.Marshal.AllocHGlobal(bufsize ) ;
System.Runtime.InteropServices.Marshal.StructureToPtr(BUF, iptr, true) ;
System.Runtime.InteropServices.Marshal.Copy(iptr, sndMsg, 0, bufsize) ;

としたらできました。
ありがとうございます。
4:  お名前:菊池 2004/12/20 9:03:09

マーシャリングの為のライブラリなのでMarshalをそう安易に使わない方がよろしいかと…

MemoryStreamとBinaryWriter/BinaryReaderを使うべきだと思います。

using System;
using System.IO;

struct Hoge
{
  public uint a;
  public uint b;
}

class Program
{
  static void Main(string[] args)
  {
  Hoge h = new Hoge();
  h.a = 100;
  h.b = 200;
  // bufferへの書き込み
  MemoryStream x = new MemoryStream();
  BinaryWriter writer = new BinaryWriter(x);
  writer.Write(h.a);
  writer.Write(h.b);
  writer.Close();
  byte[] buffer = x.GetBuffer();
  // buffer の内容を表示
  for(int i=0;i<8;i++ )
  {
  Console.Write("{0} ", buffer[i]);
  }
  Console.WriteLine();
  // 読んでみる
  MemoryStream y = new MemoryStream(buffer);
  BinaryReader reader = new BinaryReader(y);
  Hoge readed = new Hoge();
  readed.a = reader.ReadUInt32();
  readed.b = reader.ReadUInt32();
  reader.Close();
  // 読んでみた物の表示
  Console.WriteLine("readed.a={0}", readed.a);
  Console.WriteLine("readed.b={0}", readed.b);
  }
}

Marshalを使うとunsafe/unmanagedのCAS必要にならないのかしら?

5:  お名前:celica 2004/12/20 11:57:10

なるほど。
BinaryWriter等で1つ1つバッファに書き込んだ方がいいんですね。
こっちの方法でいきます。
ご指摘ありがとうございます。

>Marshalを使うとunsafe/unmanagedのCAS必要にならないのかしら?
うーん、よくわかりません。。。勉強不足です。
ポインタ使わなけりゃいいの?ていどの認識でした。。。
とくにunsafe/unmanaged等の記述なしでも動作はしました。

6:  お名前:オメガ時計 コピー 2017/11/25 22:07:53

彼のアプローチは魅力的ですが、この微妙な問題について彼を引用します:「私は、信仰そのものと私の作品を結びません。私は、私が時間を言っているの歴史に魅了されたので、宗教に関連した時計を作成します。人類のすべての神聖な本の時間について学んだ方法についての情報の驚くべき量があります。この知識を反映するために時計を作成する記念碑的な研究と仕事を必要とします。」そのようなすべての素晴らしい歴史の専用の記事―あるいは五千ページの本に値するでしょうが、現在の問題のために―しかし、彼の最新の創造に集中しましょう。
7:  お名前:プロのウブロ 時計 2017/12/01 19:46:20

ぼくらは「ついていいウソ」と「ついてはいけないウソ」を決めるようにしています。
例えば製品の発売時期といった年月日に基づく客観的な事実は変えないようにしていますが、そうではない主観的な部分は、往々にして資料ごとに食い違っているんです(笑)。
誰と誰が出会ったということでさえ、当人同士で発言内容が違っているときがある。
そうした主観の部分を使って、漫画としていかにおもしろく表現できるかを考えていますね。
1
お名前
メッセージ
次回のために入力情報を記録