- - PR -
C#でのバイト列操作について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-10 10:56
たびたびですみません。
こんな感じの@、Aの関数を実装した電文用クラスを作成するということでしょうか? @電文を作る関数 A作成した電文を取得する関数 ところで、数値型のバイトオーダ変換はAPIが用意されているのでしょうか? 文字型は、Encodingクラスにあるようなのですが... 下記処理では、配列のIndexを直接書いているのですが、これしかないでしょうか? class Telegram { byte[] m_Telegram = new byte[128]; int m_TelLen=0; publuc int GetBuffer(out byte[] tel) { //@telへ、作成した電文を格納する //A戻り値としてtelのバイト数 } public void CreateTel41(string MyTelNo ,string DestTelNo ,string FunctionCD ,ulong tag) { //引数で指定された情報をm_Telegramにbyte型として電文を作成する。 //※電文長は、m_TelLenにコピーしたサイズを計算していく必要がある。 int DataLength=0; //電文データ部サイズ DataLength = 0; int TelLen = 32 + DataLength; //電文長を計算 byte[] Len = BitConverter.GetBytes(TelLen); //数値型のバイトオーダ変換 m_Telegram[0] = Len[3]; m_Telegram[1] = Len[2]; m_Telegram[2] = Len[1]; m_Telegram[3] = Len[0]; //設定データ@ byte[] LineNo = Encoding.GetEncoding(932).GetBytes(MyTelNo); LineNo.CopyTo(m_Telegram,4); //設定データA byte[] SPC = Encoding.GetEncoding(932).GetBytes(" "); SPC.CopyTo(m_Telegram,20); //設定データB byte[] tagData = BitConverter.GetBytes(tag); tagData.CopyTo(m_Telegram,24); //設定データC byte[] FuncCD = Encoding.GetEncoding(932).GetBytes(FunctionCD); FuncCD.CopyTo(m_Telegram,28); } | ||||||||||||
|
投稿日時: 2004-05-10 11:55
諸農です。
あれれっ。。このスレッドの2004-05-07 16:30 にした私の投稿を 見て戴いていないという事でしょうか? そのほかの内容についてはまた後刻に。。m(__)m _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-05-10 12:00
失礼しました。
>また、バイナリデータの送受信をする場合には、ネットワークオ >ーダーを意識する必要があります。 >Network-OrderにはIPAddressクラスの >HostToNetworkOrder()/NetworkToHostOrder()を使います。 ということですね... ありがとうございます。 | ||||||||||||
|
投稿日時: 2004-05-10 13:03
以前、私がここで教えてもらったことが参考になるのではないかと思います。
↓ 「構造体をbyte[]にコピーしたい」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6961&forum=7 | ||||||||||||
|
投稿日時: 2004-05-10 15:54
To:回答を下さった皆様
回答ありがとうございました。 おかげさまでなんとか実装できそうです。 今後もわからないことがあった場合には、質問させていただきたいと思います。 その際は、よろしくお願いいたします。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2004-05-11 12:58
諸農です。
既に完了したようですが、気になることがあるので。。m(__)m ホストとのやり取りをする伝聞のフォーマットって言うのは 既に決まっていると思います。 Telegramクラスはクラスメンバーとして、やり取りをする項目を フィールドとして持つわけですが、そうなると
こんな定義でいいのかなと思います。 次にネットワークとのやり取りをするバイト配列を取り出す方法ですが、 ここはひどりさんからのコメントでもあるようにToByteArray()メソッドを 作るのがいいのではないでしょうか。
ToByteArray()メソッドの内部で、自分のフィールドに アクセスできるので、各項目の出力順序を並べてバイト 配列を作り出して戻り値として返すようにするとか。 そして、ネットワークから受け取った電文をこのクラスに適応するのは、 コンストラクタとstaticなメソッドを追加して。。
このようにすればいいのでは。。って思いました。 _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||
|
投稿日時: 2004-05-11 15:00
アドバイスありがとうございます。
送信時は、 @コンストラクタで情報を与える A送信用のbyte配列(バイトオーダーを意識して)を作成する関数を用意して使用する。 受信時は、 @byte配列を引数に取る関数で、受信byte配列より各情報を取出し、 メンバへセットするようにする。 A@処理後には、メンバの値を確認すれば値が取れる。 のようなクラスを用意する方法が良いということですよね? ちょっと気になったのですが、 FromByteArrayは、なぜstaticなのでしょうか? | ||||||||||||
|
投稿日時: 2004-05-11 15:53
諸農です。
はい。個人的にはまとまった感じがしていいと思うのです。
クラスオブジェクトを作成する際にデフォルトコンストラクタを 呼び出してオブジェクトを生成してからメンバーフィールドを初期化するよりも、 スタティックなメソッド呼び出しでオブジェクトを返してもらうほうが、 見た目がすっきりするような気がするのです。 電文からの組み立てでエラーになったとしても、無駄なオブジェクトを 作成していない分、地球にやさしいかな。。なんて(^_^;) _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ |