- PR -

C#でのバイト列操作について

投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 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);
}

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

引用:

Makotoさんの書き込み (2004-05-10 10:56) より:

ところで、数値型のバイトオーダ変換はAPIが用意されているのでしょうか?
文字型は、Encodingクラスにあるようなのですが...



あれれっ。。このスレッドの2004-05-07 16:30 にした私の投稿を
見て戴いていないという事でしょうか?

そのほかの内容についてはまた後刻に。。m(__)m

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2004-05-10 12:00
失礼しました。

>また、バイナリデータの送受信をする場合には、ネットワークオ
>ーダーを意識する必要があります。
>Network-OrderにはIPAddressクラスの
>HostToNetworkOrder()/NetworkToHostOrder()を使います。

ということですね...
ありがとうございます。
やむ
会議室デビュー日: 2003/08/02
投稿数: 17
投稿日時: 2004-05-10 13:03
以前、私がここで教えてもらったことが参考になるのではないかと思います。
 ↓
「構造体をbyte[]にコピーしたい」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6961&forum=7
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2004-05-10 15:54
To:回答を下さった皆様

回答ありがとうございました。
おかげさまでなんとか実装できそうです。

今後もわからないことがあった場合には、質問させていただきたいと思います。
その際は、よろしくお願いいたします。

ありがとうございました。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-11 12:58
諸農です。

既に完了したようですが、気になることがあるので。。m(__)m

ホストとのやり取りをする伝聞のフォーマットって言うのは
既に決まっていると思います。
Telegramクラスはクラスメンバーとして、やり取りをする項目を
フィールドとして持つわけですが、そうなると

コード:
class Telegram
{
    public string MyTelNo;
    public string DestTelNo;
    public string FunctionCD;
    public ulong tag;
}



こんな定義でいいのかなと思います。
次にネットワークとのやり取りをするバイト配列を取り出す方法ですが、
ここはひどりさんからのコメントでもあるようにToByteArray()メソッドを
作るのがいいのではないでしょうか。

コード:
class Telegram
{
    public string MyTelNo;
    public string DestTelNo;
    public string FunctionCD;
    public ulong tag;
    public byte[] ToByteArray(){};
}



ToByteArray()メソッドの内部で、自分のフィールドに
アクセスできるので、各項目の出力順序を並べてバイト
配列を作り出して戻り値として返すようにするとか。

そして、ネットワークから受け取った電文をこのクラスに適応するのは、
コンストラクタとstaticなメソッドを追加して。。
コード:
class Telegram
{
    public string MyTelNo;
    public string DestTelNo;
    public string FunctionCD;
    public ulong tag;
    public byte[] ToByteArray(){}
    public Telegram(string AMyTelNo,
                    string ADestTelNo,
                    string AFunctionCD,
                    ulong ATag){//初期化処理}

    static public FromByteArray(byte[] AData)
    {
        //先にネットワークバイトを
        //ホストオーダーに変換しておき。。。
        //各フィールドに分解する
        return new Telegram(項目セット);
    }
}



このようにすればいいのでは。。って思いました。


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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2004-05-11 15:00
アドバイスありがとうございます。

送信時は、
@コンストラクタで情報を与える
A送信用のbyte配列(バイトオーダーを意識して)を作成する関数を用意して使用する。

受信時は、
@byte配列を引数に取る関数で、受信byte配列より各情報を取出し、
 メンバへセットするようにする。
A@処理後には、メンバの値を確認すれば値が取れる。

のようなクラスを用意する方法が良いということですよね?

ちょっと気になったのですが、
FromByteArrayは、なぜstaticなのでしょうか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-11 15:53
諸農です。

引用:

のようなクラスを用意する方法が良いということですよね?



はい。個人的にはまとまった感じがしていいと思うのです。

引用:

ちょっと気になったのですが、
FromByteArrayは、なぜstaticなのでしょうか?



クラスオブジェクトを作成する際にデフォルトコンストラクタを
呼び出してオブジェクトを生成してからメンバーフィールドを初期化するよりも、
スタティックなメソッド呼び出しでオブジェクトを返してもらうほうが、
見た目がすっきりするような気がするのです。
電文からの組み立てでエラーになったとしても、無駄なオブジェクトを
作成していない分、地球にやさしいかな。。なんて(^_^;)

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

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

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