Mscommでデータを受信する際
Inputmodeをテキストモードで下記のコードで行っています。
しかし、1バイト文字の場合は問題ないのですが
2バイト文字の場合、2バイトの上位1バイトを受信した場合
文字化けが発生します。
バイナリモードで受信する方法までは分かったのですが
下記コードを元に変更する場合は、どのようにすればよいか
悩んでいます。どなたかご教授願います。
Dim txt As String
Dim ret As String
Do
ret = BuffRed
Select Case ret
'-- LF
Case Chr$(&HA) '-- LF
'-- CR
Case Chr$(&HD) '-- CR
Debug.Print txt
Exit Sub
Case Else
txt = txt + ret ←この部分をバイト配列で結合する場合は?
End Select
Loop
Private Function BuffRed()
BuffRed = Comm1.Input
End Function
まず、stringで宣言されているのを
byte配列に変えましょう。
過去ログに似たようなのが
'http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200310/03100030.txt
> txt = txt + ret ←この部分をバイト配列で結合する場合は?
受信したバイト配列を、一時ファイルに Put # していき、
完了時点でそれを Get # で取り出す…という方法は如何でしょう。
もしも一時ファイルを作りたくないのであれば、ストリームが便利かも。
Dim bin() As Byte '受信データを受け取る変数
Dim Stm As ADODB.Stream 'バイナリを蓄えるためのストリーム
'バイナリストリームを作成
Set Stm = New ADODB.Stream
Stm.Type = adTypeBinary
Stm.Open
'
' ……略……
'
'受信したバイナリを連結
Stm.Write bin 'これが「txt = txt & ret」に相当する処理
'
' ……略……
'
'Shift_JIS のテキストストリームに切り替えて、
'受信したバイナリを、文字列として取得する。
Stm.Position = 0
Stm.Type = adTypeText
Stm.Charset = "Shift_JIS"
txt = Stm.ReadText(adReadAll)
ツイート | ![]() |