• 締切済み

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

現在ハンディターミナル(HT)とPCとの通信を行うプログラム(VB6.0)を作成しています。 このプログラムは元々VB2.0で作成されたものをベースとしてVB6.0で再作成しているものです。 プログラムの中でHTとPCとの通信エラーを防ぐため、データ行のBCCを計算しHTに送信している 部分があります。VB6.0ソースを下に表示します。 (実際は、計算したBCCをデータ(下のCheckString変数)の最終行にくっつけてHTに送信していますが、ここではBCCのみ送信しています) -------------------------------------------------○VB6.0 /* 最初にBCCを計算して返し、HT側へ送信している */ /* BCCはstring */ Dim i As Integer, aa As Integer,BCC as String aa = 0 For i = 1 To Len(CheckString) aa = aa Xor Asc(Mid(CheckString, i, 1)) Next BCC = Chr$(aa) frmMain.MSComm1.InBufferCount = 0 frmMain.MSComm1.Output = BCC ------------------------------------------------ VB2.0ではAscB,LenB,MidBのところをVB6.0ではAscB,LenB,MidBをAsc,Len,Midへ変更しています。通常はこれで問題ありませんでしたが、BCCの計算の結果aa = 226となった場合にBCCに文字化けした"r"のような文字がはいっていました。プログラムの中でBCC変数をテキストへ吐き出し、バイナリエディタで確認しましたが"E2"となるところに"00"と空白となっており、これが原因でHTとPC間での通信が完了しません。 (テキスト送信時にStringのため文字化けが原因?) 前回の質問でSTRING型を使用せずにバイナリ型配列で処理する事や、いままで暗黙のうちにUnicode⇔SJIS変換を行ってくれていた部分をStrconvを使用し自前で処理しなければいけないというご指摘を受けたのですが、上のプログラムではどのように修正が必要なのでしょうか?どなたかご教授の程宜しくお願い致します。

みんなの回答

  • dee_honda
  • ベストアンサー率53% (26/49)
回答No.2

BCC は As Byte で BCC = ChrB(aa) か BCC = CByte(aa) で。

回答No.1

BCCをStringで宣言しているのはダメです。 BCCの計算結果は0~255の範囲の全ての値になる可能性がありますが、 String型変数には、文字コードとして有効な文字しか入りません。 無効な文字コードをChr$()で与えてもChar$(0)に置き換えられてしまいます。 関連情報として、UBound、Redimあたりを調べると良いでしょう。

関連するQ&A

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

    文字コードについて 現在ハンディターミナルとPCとの通信を行うプログラム(VB6.0)を作成しています。      プログラムの一部で下のような記述があります。 ------------------ BCC = Chr(aa) ------------------ 変数aaには数字の226が入り、変数BCCには226に該当する文字列が格納されるはずですが、BCCには文字化けした文字が入り困っています。 調べた結果VB6.0は文字列をunicodeとして扱い、その結果内部的な文字列変換が理由で、文字コード上に存在しない幾つかのバイナリデータは、Chr関数で扱えないというところまではわかりました。 そこでChr命令をChrB命令に変更しましたが、求めている答えが返ってきませんでした。 文字コード表では"DF"までは存在しますが、それ以降の文字は存在しないため扱うのは無理なのでしょうか? StrConvなどを使用すれば可能なのかどうか等考えているのですがわからない状況です。 どなたかご教授願えないでしょうか。宜しくお願い致します。

  • VBへの変換の仕方 RS232C送信データとチェックサム

    以下のプログラムをVBに変換する仕方を教えてください。 サンプルプログラム 1110 CHKSUM=0 1120 FOR i=1 to LEN(A$)      'A$は送信データ 1130 CHKSUM=CHKSUM+ASC(MID$(A$,i,1) 1140 NEXT i 1150 C$=CHR$((CHKSUM+13) MOD 256) 1160 PRINT #1,A$;CHR$(13);C$; 私のVBプログラムは1110行から1150行まではそのままで CHKSUM=0 FOR i=1 TO LEN(A$) CHKSUM=CHKSUM+ASC(MID$(A$,i,1) NEXT i C$=CHR$((CHKSUM+13) MOD 256) としました。 送信部分を MSComm1.Output =A$ & CHR$(&H13) & C$ としてみましたが 1160行にあるセミコロン ";" はCHR$(&h3B) として送る必要があるのでしょうか? MSComm1.Output =A$ & CHR$(&h3B) & CHR$(&h13) ・・・・・・ また、データとしてA$="I 02"のチェックサムは "リ" となりますが正しいのでしょうか? 以上ご教示ください。

  • 教えてください。VBでのバイナリデータ。

    EUCコードで作成されたlndatファイルをオープンし、 コード変換するプログラムを作っています。 データの所得時にHexを使っているのですが、 所得データが 000000000000000000220801011200012000 となっています。 元データは 000000000000000000000000000000000000220080010001012000000120000000000000 なため、この様に所得したいのですが、上手く所得できません。 こういったデータの所得は可能なのでしょうか? また、自分の作成したソース自体にバグがあるのでしょうか? よろしかったら教えてください。 >>以下ソース Dim Data As Byte     '所得データ(1バイトごと) Dim Data_A As Variant 'ファイルから所得したデータ(ALL) Dim I As Long 'カウンター Dim File_Name As String 'ファイル名 Dim Filnm As Long 'ファイル番号 I = 1 Data_A = "" Filnm = FreeFile File_Name = "AA.lndat" Open App.Path & File_Name For Binary As #Filnm Do While EOF(Filnm) = False Get #Filnm, I, Data Data_A = Data_A & Hex(Data) I = I + 1 Loop Close #Filnm >>開発環境 VB5.0(SP3) Win2000 フリーのDLL等は使用不可能とお考え下さい。

  • VB6.0での小数点の扱いについて

    現在、VB6.0を使用しており、小数点の扱いに困っています。 Sub Keisan() Dim A As String Dim B As String Dim C As String A = 1.29033 B = 1.91458 C = CStr(A + CDec((B - A) / 6) * 3) MsgBox C End Sub 上記のプログラムを実行すると、 「1.602455000000001」と表示されますが、 電卓を用いて計算すると、 「1.602454998・・・」となり、微妙に誤差が出てしまいます。 小数点を整数にして計算→元の桁数に戻す、という 処理を行うと、誤差なく求めることが出来ましたが、 「もっとスマートなコードにして」と言われてしまいまして どうしたものかと思っております。 この誤差を解決する方法は無いでしょうか?

  • VB.Netでのシリアル通信についての質問

    VB6.0でバイト型変換を行ってからバッファに送信する プログラムを使用しているのですが、これを.Netにて 同様に行う記述方法が分りません。お分かりになる方 よろしくお願い致します。抜粋しておりますのでヘンテコ なソースかとは思いますがよろしくお願い致します。主にChrBが使用出来なくなった事が困っております。 (VB6.0と同様にAxMSCommを使用しております。) Private Sub Rs232c_Com() Dim bytOutByte() As Byte Dim strCmdData as String   strCmdData="83" 'コマンド送信 bytOutByte() = ChrB(Val("&h" & strCmdData)) MSComm1.Output = bytOutByte() End Sub

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • VB2008で全角半角の判定

    VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。  dim moji as string dim zhN as integer  zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、  半角なら zhN = 1 全角なら zhN = 2 となる。  これをVB2008で実現する方法がわかりません。  よろしくお願いします。

  • データ送信

    MSCommのOutPutプロパティを使用して送信します。 Dim Buffer As String  Buffer = "Dummy" MSComm1.Output = Buffer RS-232C接続をしたデバイスにデータを送信します。 このとき、受信するデバイスがいないとMSComm1.Outputステートメントの処理に約4-5秒かかります。 これは仕様ですか? MSComm1.Iutputプロパティを含めて、タイムアウトに関して参考になるドキュメントやサイトがございましたら教えていただけませんか?

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • VB2008 バイナリデータの書き込みで

    現在、VB2008でバイナリデータを書き込むプログラムを作成しているのですが、String型のデータをバイナリデータに書き込むと、なぜかそのバイナリデータの先頭に05が入ってしまいます。 コードは以下のように記述しています。 TextBox1.Text = "TEST" Dim Bin As New System.IO.BinaryWriter(New System.IO.FileStream(filename, IO.FileMode.Create)) ~~~省略~~~ Bin.Write(TextBox1.Text) ~~~省略~~~ Bin.Close() 書き込まれたバイナリデータは、 05 54 45 53 54 で、テキスト欄では、 .TEST と表示されます。 分かりにくい質問で申し訳ありませんが、回答よろしくお願いします。

専門家に質問してみよう