C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.26468 の関連記事表示

<< 0 >>
■26468  C#で通信データを構造体にcastしたいのですが。
□投稿者/ ぼつ -(2008/10/09(Thu) 21:45:53)

    分類:[C#] 

    はじめまして。
    C#初心者です。

    開発環境:VS2005 C#

    サーバ・クライアント間でデータの送受信(TCP/IP)を行う際に、送信データを構造体にセットして、
    受信時にデータを取り出しやすく作りたいと思っています。(C言語ではそのような記述で動作させた事があります。)
    例えば、下記のようなデータを構造体にしてやりとりしたいのですが、C#では構造体をcastできないのでしょうか?
           char A[5];
           char B[2];
    int C;
    long D;

    もしくはもっと便利な書き方があるのでしょうか?
    ちなみに通信相手は、WindowsでないOSでC言語で記述しています。

    初めての質問で上手く質問できていませんが、よろしくお願いします。




親記事 /過去ログ48より / 関連記事表示
削除チェック/

■26471  Re[1]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ やじゅ -(2008/10/10(Fri) 01:02:49)
>
    No26468 (ぼつ さん) に返信
    > サーバ・クライアント間でデータの送受信(TCP/IP)を行う際に、送信データを構造体にセットして、
    > 受信時にデータを取り出しやすく作りたいと思っています。(C言語ではそのような記述で動作させた事があります。)
    > もしくはもっと便利な書き方があるのでしょうか?
    > ちなみに通信相手は、WindowsでないOSでC言語で記述しています。
    >

    XML形式で記述して、通信相手に受け渡すとか
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26473  Re[1]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ Jitta on the way -(2008/10/10(Fri) 07:14:12)
    No26468 (ぼつ さん) に返信
    > はじめまして。
    > C#初心者です。
    >
    > 開発環境:VS2005 C#
    >
    > サーバ・クライアント間でデータの送受信(TCP/IP)を行う際に、送信データを構造体にセットして、
    > 受信時にデータを取り出しやすく作りたいと思っています。(C言語ではそのような記述で動作させた事があります。)
    > 例えば、下記のようなデータを構造体にしてやりとりしたいのですが、C#では構造体をcastできないのでしょうか?
    >        char A[5];
    >        char B[2];
    > int C;
    > long D;
    >
    > もしくはもっと便利な書き方があるのでしょうか?
    > ちなみに通信相手は、WindowsでないOSでC言語で記述しています。
    >

    構造体のコンストラクターで、バイトを取り出して代入すると言う方法になります。


    アライメントと、エンディアンに要注意。その構造体、2+5+4+4 バイトじゃないですよ。
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26474  Re[2]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ Jitta on the way -(2008/10/10(Fri) 07:21:18)
    No26473 (Jitta on the way さん) に返信

    > アライメントと、エンディアンに要注意。

    訂正
    バイト オーダー
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26486  Re[1]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ 倉田 有大 -(2008/10/10(Fri) 18:21:54)
    > ちなみに通信相手は、WindowsでないOSでC言語で記述しています。

    もう書かれてますが、マシン変わるとバイトオーダーがかわるので、バイナリーそのまま送ってキャストは無理じゃないかと。
    やったことないけど、シリアライズ、デシリアライズがいいのかな?
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26487  Re[2]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ ぽぴ王子 -(2008/10/10(Fri) 18:50:59)
>
    No26486 (倉田 有大 さん) に返信
    >>ちなみに通信相手は、WindowsでないOSでC言語で記述しています。
    >
    > もう書かれてますが、マシン変わるとバイトオーダーがかわるので、バイナリーそのまま送ってキャストは無理じゃないかと。
    > やったことないけど、シリアライズ、デシリアライズがいいのかな?

    バイトオーダーは変わらないような気がするです。アライメントのことかな。
    (CPUが変わったらバイトオーダーも変わる可能性はあるけれど)

    結局のところ、そのままではダメというのは皆さんの共通認識なので、一項目ずつバラして転送するとか
    テキストだったりXMLファイルだったり、影響をあまり受けない形式に変換して転送するということに
    なるんじゃないかと思います。どうやるかは実装する人次第ですね。
    シリアライズ&デシリアライズってのも広い意味でこれに含まれると思います。
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26489  Re[3]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ ぼつ -(2008/10/10(Fri) 22:31:47)
    みなさん返信ありがとうございます。

    現在は、各変数間に区切り文字を入れて送信し、受信側で区切り文字を検出しポインタ移動させて各データの取り出しを行っています。
    これが面倒というかメンテナンスしにくい書き方だったので、キャストしたいと思っていました。
    みなさんのご意見からキャストはなかなか難しい事が分かりました。

    XMLというのはまだ使った事がないので、少し勉強してみたいと思います。

    Jitta on the way さんのおっしゃる「構造体のコンストラクターで、バイトを取り出して代入する方法」というのが勉強不足のため、あまりピンとこないのですが、classを作成するのでしょうか?
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26492  Re[4]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ yamyam -(2008/10/11(Sat) 01:16:45)
    No26489
    > Jitta on the way さんのおっしゃる「構造体のコンストラクターで、バイトを取り出して代入する方法」というのが勉強不足のため、あまりピンとこないのですが、classを作成するのでしょうか?

    これは、

    No26489
    > 現在は、各変数間に区切り文字を入れて送信し、受信側で区切り文字を検出しポインタ移動させて各データの取り出しを行っています。

    この処理をするためのメソッド(コンストラクタでも何でも良いけど)を「構造体が持っていると、関連性が理解し易い」という感じですかね?
    既にその処理は実装されている様ですので、その扱い方(表現?)の違いかと。
    .Netだと構造体とクラスでコンストラクタの仕様に違いがあった気がするけど何だっけ?

    参考までにこのような情報も。
    ぬるり。
    From Structure To Bytes:構造体へのポインタからByteの一次元配列へのキャスト方法
    http://hongliang.seesaa.net/article/10208235.html

    バイナリデータ中の何バイト目がヘッダ、データサイズ、チェックサム等ですよ、という仕様を決めて、
    バイト配列をゴニョゴニョするのは...メンドクサイデスヨネ...
    作った事はあるんですけどね(仕様は別)。仕事で。VB2005で。マルチスレッドで。TCPで。winsockで。
    通信コンポーネントを使いたかったなぁ。


記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/

■26497  Re[4]: C#で通信データを構造体にcastしたいのですが。
□投稿者/ Jitta -(2008/10/11(Sat) 20:50:24)
>
    No26489 (ぼつ さん) に返信
    > みなさん返信ありがとうございます。
    >
    > 現在は、各変数間に区切り文字を入れて送信し、受信側で区切り文字を検出しポインタ移動させて各データの取り出しを行っています。
    > これが面倒というかメンテナンスしにくい書き方だったので、キャストしたいと思っていました。
    > みなさんのご意見からキャストはなかなか難しい事が分かりました。
    >
    > XMLというのはまだ使った事がないので、少し勉強してみたいと思います。
    >
    > Jitta on the way さんのおっしゃる「構造体のコンストラクターで、バイトを取り出して代入する方法」というのが勉強不足のため、あまりピンとこないのですが、classを作成するのでしょうか?

     現在の構造体が、このようになっていると書かれています。
    struct a {
      char A[5];
      char B[2];
      int C;
      long D;
    };

     この構造体は、パッと見は 5+2+4+4 (long = int で 32bit とした場合)で15バイトのように見えます。
    しかし、実際には16バイトあります。それは、メモリの使用領域が4バイトごとに整えられ、5+2 の後に整列用の1バイトが追加されるからです。(いくつかのコンパイラで、整えるのを何バイトにするか、選べます)
    つまり、
    struct a {
      char A[5];
      char B[2];
      char dummy; // ここにはアクセスできない
      int C;
      long D;
    };
    となっています。

     そのほかに、インテルおよびその互換 CPU は、複数バイトの場合に小さい桁が前に来ます。最近は UNIX も x86 互換で動くので同じなのかもしれませんが、通信相手によっては小さい桁が後ろにある場合があります。これがバイト オーダー。

     他の OS と通信をする場合、この二つがどうなっているか、きちんと押さえておく必要があります。

     今、「各変数間に区切り文字を入れて送信」と書かれていますが、おそらく、アライメントについて詳しくない人が、「送った桁と受け取った桁があわない」ことから、「区切り文字を入れて、ここまで、というのを示そう」としてしまったのではないかと思います。


     ですから、バイト オーダーが同じであることを確認し、アライメントの調整を行えば、キャストすることができます。
    しかし、C# ではポインタをそのままでは扱えません。unsafe キーワードについて、調べてみてください。


     あ、5バイト2バイトであれば大丈夫だと思いますが、そこに「日本語の文字」は入るのでしょうか?入るのであれば、文字コードも調べておかなければなりません。
記事No.26468 のレス /過去ログ48より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -