• ベストアンサー

バイト配列 抜き出す

はじめまして。 VB6.0 MSCommを使用して,44バイトのデータを受信するプログラムを作成中です。 ここで質問なのですが, 44バイトのデータをバイト配列に格納するまでは良いのですが,必要なデータは(10バイト目~14バイト目)のデータしか必要がありません。この必要な部分だけ切り出せる関数などはありませんか? 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

ANo.2です。 書き方が悪かったみたいですみません。 d = MidB(d, 10, 5) だけが言いたかった事です。 >44バイトのデータを1バイトずつ配列に入れているのですか? そうです、質問で >44バイトのデータをバイト配列に格納するまでは良いのですが とあったので、前半部分はサンプルデータを作っています。 後半部分は結果表示です。 >10バイト目から5バイト分 d配列に入れてますか? そうです。 別のバイト配列を用意すれば良かったのですが、こんな風にできるというサンプルなので。 p.s. 実際にはvbaで覚えた方法なんですが、いったん文字列変数に代入すると、前から取り出して後に追加するとかの処理が楽です。 ただし、midbでなくmidの場合など、文字コードが関係する文字列操作関数を使うとおかしくなる場合がありますので、気を付けてください。

その他の回答 (3)

回答No.3

先の天秤の件ですよね。 そうだったら、 Split関数を 調べてみて。

回答No.2

こんなのはどうでしょう。 正しい使い方かどうかは別ですが・・・ Private Sub Command1_Click() Dim d() As Byte Dim i As Integer ReDim d(43) For i = 0 To 43 d(i) = i + 1 Next d = MidB(d, 10, 5) For i = 0 To 4 MsgBox d(i) Next End Sub

hiroki1227
質問者

補足

ReDim d(43) For i = 0 To 43 d(i) = i + 1 Next に関してですが 44バイトのデータを1バイトずつ配列に入れているのですか? d = MidB(d, 10, 5) 10バイト目から5バイト分 d配列に入れてますか? For i = 0 To 4 MsgBox d(i) 5バイトの配列の1バイトずつ切り出しているのですか? 何度も質問して申し訳ありません。 時間がありましたら回答宜しくお願いします。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

「バイト配列の途中から切り出した新しい配列を作りたい」と言うことなら、 そういう関数は準備されていません。 ループ処理で、1バイトずつコピーしてください。

関連するQ&A

  • VB RS-232C 通信プログラム

    何度もお世話になっております。(VB6.0 MSCommを使用した通信プログラムを作成中です。)私は新卒で食品会社に入社したのですが,プログラムの分かる上司が身近では誰1人といない状況で困っています。 今作成しているのは,重量計に荷物が乗った段階で作業者がデータ転送ボタン(重量計についている)を押すと,重量計のデータ(500kgというデータ)をシリアルでCOM1に取り込み,フォームにエクセルのセルを作成し(OLEを用いて)保存できるようにしたいと考えています。 (重量計から送られてくるデータのフォーマット) 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 S T , N T , + 0 0 1 2 . 3 4 k g CR LF ST ; ヘッダ1 NT ; ヘッダ2  CRLF ; ターミネータ                   の18バイトのデータです。 ここで質問なのですが (1) 以下のプログラムで重量はバイト配列に受信できていますでしょうか?(実際に重量計とPCを接続できれば良いのですが工場の稼動状況が関わっておりすぐにはできません。) (2) 18バイトのデータを受信するからと言って RThreshold = 18 として良いのでしょうか? 普通,データは1バイトずつ送られてくると思うので RThreshold = 1としてイベントを発生させる必要があるのかとも思うんですが。 'MSComm1,2(COM1,2)コントロールの初期設定 Private Sub Form_Load() MSComm1.CommPort = 1 '通信ポートを設定 MSComm1.Settings = "9600,n,8,1" '通信条件の設定 MSComm1.RThreshold = 18 '固定長のデータ End Sub Private Sub Port1_Click() 'Port1_Clickのクリックイベントプロシージャ If MSComm1.PortOpen = False Then 'シリアルポートのオープン MSComm1.PortOpen = True End If LPort1.Text = "" 'テキストボックスのクリア受信 End Sub Private Sub MSComm1_OnComm() '受信のOnCommイベント Dim Buffer1(0 To 17) As Byte '受信バッファの変数宣言(18バイト) Select Case MSComm1.CommEvent 'CommEventプロパティに対する処理 Case comEvReceive '受信データ有り    Buffer1 = MSComm1.Input '受信データをバッファに格納 'これより下は受信した18バイトから必要なデータ8バイト目から4バイト分切り出し,dという配列(4バイト)に格納できないかと考えました。 Dim i As Integer Dim d(0 To 3) As Byte d = MidB(Buffer1, 8, 4) LPort1.Text = d 'LPort1.Text = Buffer1 '受信データをテキストボックスに表示 End Sub

  • 8桁文字列を16進数バイト配列に変換

    お世話になります。 VB2005を使用しています。 温調器から温度データを引っ張るプログラムを作成しています。 8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。 8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか? 文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか? よろしくお願い致します。

  • Mscomm を使用してバイナリでデータを受信したい

    Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか? (垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >) また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか? まず考え方として以下の流れでよいでしょうか? バイナリデータをバリアント型の変数に入れる。(受信する)      ↓ このデータを1バイトごとにバイト型変数の配列に入れていく。      ↓ 格納した配列の中の制御文字を取り除く。( ST、EX )      ↓ 配列に入っているデータを文字に変換する。      ↓ 変換した文字をつなぐ。 受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。 宜しくお願い致します。

  • VB2005 コントロール配列について教えていただけませんか?

    現在VB2005を用いてプログラムを行なっている初心者です。 ここのサイトでVB2005ではコントロール配列は使用できないことを知りました。そこで、例えばフォーム上にTextBoxを5個配置して、各TextBoxに入力された値を配列に格納するのにはどのようにすれば良いでしょうか? data(0) = textbox1.text data(1) = textbox2.textと一つずつやるしかないでしょうか・・・ For文などを用いて簡単にできる方法を教えてください。 よろしくお願い致します。

  • こんにちは、VBはじめたての初心者です。MSCommコマンドを利用して

    こんにちは、VBはじめたての初心者です。MSCommコマンドを利用してマイコンと 通信するプログラムを作成中なのですが、わからないことがあるので質問させていただきます。 public aub form_load() MSComm1.CommPort = 3 'ポート番号設定 MSComm1.Settings = "115200,N,8,1" '設定 MSComm1.PortOpen = True 'ポートオープン MSComm1.Handshaking = comNone 'フロー制御無し MSComm1.RTSEnable = False 'RTS制御無し MSComm1.RThreshold = 1 '1バイト受信毎にOnCommイベント発生 Dim txBuffer As String End sub 'テキストに表示した受信文字列を変数に格納、さらに必要な文字列だけ抽出する Private Sub botan_Click() txBuffer = Text2.Text x = InStr(1, txBuffer, "e" & vbCrLf, 1) txBuffer = Mid(txBuffer, x + 3, (Len(txBuffer) - (x + 2))) Text1.Text = txBuffer 'txBufferの内容確認用 End Sub Private Sub cmdr_Click() Text2.Text = "" MSComm1.Output = "r a0 s 00 j ff" & Chr(13) 'マイコンのデータを読み込むコマンド End Sub Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive Buffer = MSComm1.Input Text2.Text = Text2.Text & Buffer ・ ・ ・ End Select End Sub おおざっぱですがこのようなプログラムをつくりました。 目的は受信された文字列(テキストに表示)を変数に格納、さらに必要な文字列だけ抽出する ことなのですが、このプログラムだとデータを読み込むコマンドを送るボタンとそのデータを 変数に格納して必要な部分を抽出するボタンを二回押さなければならず面倒なので、botan_Click() の中の命令をそのままcmdr_Click()に入れたのですが、そうするとエラーが出てしまいます。 いろいろと試したのですがどうやらtxBufferの中に受信データが入ってくれないみたいです。 原因は何か。何かいい方法がないかアドバイスいただけたら幸いです。 やりたいことは、一回のボタンクリックで変数に受信データのほしいとこだけを格納させることです。 よろしくお願いします。

  • VB.NETの配列

    こんにちわ。 いまVB.NET2003で開発をしている者です。 たとえば画面で入力された最大400文字(800バイト)の テキストを50文字(100バイト)ずつに区切って, 配列に格納したいのですが, 関数など,効率の良い方法はあるでしょうか? 教えてください。よろしくお願いします。

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • バイト配列を別名で扱う方法

    VisualBasic2008 ExpressEditionにてPLCと通信するアプリケーションを作成しています。 受信したデータは、Publicなバイト配列に格納されています。 Public Dat(63) as byte 'こんな感じです 内容は、ビット単位と32ビット符号付き整数があります。 ビット単位は、And演算子にて判定し32ビット符号付き整数は、BitConverter.ToInt32にて数値化して使用しています。 この方法だとコードが煩雑で可読性が悪い状態です。 質問ですがこのバイト配列変数を別名で参照し扱う事はできますか? たとえばDat(2)の3ビット目を"exp"と別名で宣言しコードの中で扱いたいです。"exp"に変更を行うとバイト配列も変更されて欲しいです。 上司が以前のバージョンにあったような気がすると助言してくれたので調査しています。 私が調べた限りでは、見つける事ができず最も適していると思われるのはクラス化でした。 アドバイスお願い致します。

  • 仮想COMポートからの読み込みがうまくいきません

    USB接続の仮想COMポート接続デバイス相手のプログラムをVB6.0で作成中です。 WindowsXP上では問題なく送受信できるのですが、Windows2000上では 問題が発生します。512byteのバイナリデータを受信したいのですが、途中でデバイス側の応答が止まってしまいます。 MSCOMMを使用していたので、それが良くないのかと思い、他のもの(CommOcx)を使用してみましたが結果は変わりませんでした。 Windows2000の場合には、なにか特別な処理が必要なのでしょうか?

  • 配列データの書込み方法

    VBを使用してAccessへのデータ追加の方法を教えて下さい。 配列に格納されたデータ(件数:1万データ)を1レコードづつ書き込むのではなく、一括して書き込む方法がありましたら教えて下さい。

専門家に質問してみよう