マンガでよめる痔のこと・薬のこと

はじめまして。

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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.2です。



書き方が悪かったみたいですみません。
d = MidB(d, 10, 5)
だけが言いたかった事です。

>44バイトのデータを1バイトずつ配列に入れているのですか?
そうです、質問で
>44バイトのデータをバイト配列に格納するまでは良いのですが
とあったので、前半部分はサンプルデータを作っています。
後半部分は結果表示です。

>10バイト目から5バイト分 d配列に入れてますか?
そうです。
別のバイト配列を用意すれば良かったのですが、こんな風にできるというサンプルなので。

p.s.
実際にはvbaで覚えた方法なんですが、いったん文字列変数に代入すると、前から取り出して後に追加するとかの処理が楽です。
ただし、midbでなくmidの場合など、文字コードが関係する文字列操作関数を使うとおかしくなる場合がありますので、気を付けてください。
    • good
    • 0

先の天秤の件ですよね。


そうだったら、
Split関数を
調べてみて。
    • good
    • 1

こんなのはどうでしょう。


正しい使い方かどうかは別ですが・・・
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

この回答への補足

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バイトずつ切り出しているのですか?

何度も質問して申し訳ありません。
時間がありましたら回答宜しくお願いします。

補足日時:2008/01/30 17:50
    • good
    • 0

「バイト配列の途中から切り出した新しい配列を作りたい」と言うことなら、


そういう関数は準備されていません。

ループ処理で、1バイトずつコピーしてください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

Qバイト型のデータをLong型に変換

初歩的なことですみません。

Dim a(0 to 3) as Byte
Dim b as Long
と宣言します。
この変数aをLong型のbに変換するにはどのように
したらよいのでしょうか?
逆にbの値をaに変換する方法もできましたらお願いします。

Aベストアンサー

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
MoveMemory a(0), b, 4
MoveMemory b, a(0), 4

--
(2)が手堅く応用が利くかと。
(3)はlongならいいが、4の倍数でない型は問題あるかも。

色々な方法があります。

(1)論理演算子

a(0) = b And &HFF#
a(1) = (b And &HFF00#) / &H100#
a(2) = (b And &HFF0000#) / &H10000#
a(3) = (b And &H7F000000#) / &H1000000#
If (b And &H8000000) Then
a(3) = (a(3) Or &H80)
End If

(2)ファイル

Open "temp.tmp" For Binary As #1
Put #1, 1, b
Get #1, 1, a
Close #1

(3)RtlMoveMemory

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (D...続きを読む

QVisual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください

string(9)のエリア"Aa1アあa "の文字を1文字ずつASCII変換して、16進変換し、string(18)のエリアに格納します
すると"416131B182A08281202020"と変換されます
(一文字ずつ Hex(Asc(Buf))を使用しました)

逆に、"416131B182A08281202020"を"Aa1アあa "に戻したいのですが、
どのような関数を使えばよいのかわかりません。
困っています。教えてください。よろしくお願いいたします。

Aベストアンサー

VB既存の関数ではできないと思うので、自分で関数を作るなりしてください。

ヒントです。
ASC関数により変換された2バイト文字(シフトJIS)の1バイト目は81~9FおよびE0~FC(すべて16進)になります。
16進数から10進数に戻すには、頭に"&H"をつけます。(&H82A0 = 「あ」のシフトJISコード)
文字を数字に変換するのはVal関数、数字(文字コード)から文字に変換するのはChr関数です。

Q[VB.net] StringからByte配列への変換

皆さんこんばんは。
最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。
VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。


CByte( Mid(str,i,1) )
CLng( Mid(str,i,1) )

他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。
("『"を上下反転したような文字)


ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。

よろしくお願いします。

Aベストアンサー

Option Explicit On
Option Strict On
Option Compare Binary
Option Infer Off ' VB2008以上。
Class Q3512824

Shared Sub Main()
Dim Str1 As String = "ほげふが"
Dim ByteArray1 As Byte()
'Code Page 932 = Shift_JISもどき
'Code Page 65001 = UTF-8
ByteArray1 = System.Text.Encoding.GetEncoding(65001).GetBytes(Str1)
For Each Byte1 As Byte In ByteArray1
System.Console.WriteLine(Byte1.ToString)
Next
End Sub
End Class

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVBAのバイナリ出力について

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #numff

temp = Range("C3")
Print #numff, temp

Close #numff

End Sub

(Sheet1のセルのC3に512文字入っています。)

これをOutputをBinaryにして・・・Putで書く?
多分2文字を取り出して・・・書き込む?ような感じなのですが
それをプログラムに起こす書き方がわからず困っています。

申し訳ございませんが、ご教授よろしくお願いします。。。

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #num...続きを読む

Aベストアンサー

akichan1jp さん
こんにちは。
次のプログラムでできると思います。

Sub test()
 TEMP = Worksheets("Sheet1").Range("C3")
 ReDim BIN(Len(TEMP) / 2 - 1) As Byte
 For I = 1 To Len(TEMP) Step 2
   BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
 Next I
 Open "1.BIN" For Binary As #1
 Put #1, , BIN
 Close #1
End Sub

注)"1.BIN"は事前に削除した方が安全です。
  例えばファイルの大きさが小さくなると、前のファイルの大きさがに維持されてしまいます。
  ご注意ください。

ご確認下さい。

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

QVB6.0でのバイナリデータの扱いについて

文字コードについて

現在ハンディターミナルとPCとの通信を行うプログラム(VB6.0)を作成しています。
    
プログラムの一部で下のような記述があります。

------------------
BCC = Chr(aa)
------------------

変数aaには数字の226が入り、変数BCCには226に該当する文字列が格納されるはずですが、BCCには文字化けした文字が入り困っています。
調べた結果VB6.0は文字列をunicodeとして扱い、その結果内部的な文字列変換が理由で、文字コード上に存在しない幾つかのバイナリデータは、Chr関数で扱えないというところまではわかりました。
そこでChr命令をChrB命令に変更しましたが、求めている答えが返ってきませんでした。
文字コード表では"DF"までは存在しますが、それ以降の文字は存在しないため扱うのは無理なのでしょうか?

StrConvなどを使用すれば可能なのかどうか等考えているのですがわからない状況です。
どなたかご教授願えないでしょうか。宜しくお願い致します。

文字コードについて

現在ハンディターミナルとPCとの通信を行うプログラム(VB6.0)を作成しています。
    
プログラムの一部で下のような記述があります。

------------------
BCC = Chr(aa)
------------------

変数aaには数字の226が入り、変数BCCには226に該当する文字列が格納されるはずですが、BCCには文字化けした文字が入り困っています。
調べた結果VB6.0は文字列をunicodeとして扱い、その結果内部的な文字列変換が理由で、文字コード上に存在しない幾つかのバイナリデータは...続きを読む

Aベストアンサー

String型は、Unicode(UTF-16)でデータが入ってくることが前提なので、
String型に対してChrB()、Chr()で非Unicode文字をセットしても解決にはなりません。
バイナリーデータは、String型は一切使用せずにバイト型配列で処理するのが基本です。

>BCCをbyte型とした場合、
>今度は問題なかった文字コードが文字化けする事や、
>かえってくる文字列がかわるような事はありませんか?
たとえ偶然であっても、他のうまくいっているString型の変数は、いじる必要はないわけですが、
もしBCCという変数で、その他のうまくいっている文字列を同時に扱っているのであればそうなるかもしれません。
(いままで暗黙のうちにUnicode⇔SJIS変換を行ってくれていた部分
を自前で処理する必要があります)
具体的には、
バイト型配列 = StrConv(String型変数, vbFromUnicode)
String型変数 = StrConv(バイト型配列, vbUnicode)
のような処理が必要でしょう。

String型は、Unicode(UTF-16)でデータが入ってくることが前提なので、
String型に対してChrB()、Chr()で非Unicode文字をセットしても解決にはなりません。
バイナリーデータは、String型は一切使用せずにバイト型配列で処理するのが基本です。

>BCCをbyte型とした場合、
>今度は問題なかった文字コードが文字化けする事や、
>かえってくる文字列がかわるような事はありませんか?
たとえ偶然であっても、他のうまくいっているString型の変数は、いじる必要はないわけですが、
もしBCCという変数で、そ...続きを読む


人気Q&Aランキング