テキストデータをバイナリデータへ変換したいのですが

解決


ゆうき  2005-05-13 09:05:04  No: 121618

いつも拝見させて頂いております。
早速ですが、テキストボックスに表示されているデータを、
そのままバイナリデータに変換して、COMポートから
送信したいのですが、どうしてもデータ変換のところが
うまくできません。
たとえば、テキストボックスに、"FF"と入っていたら、
それをバイナリデータの"FF"として送信したいのです。
WEBやヘルプ等で検索してみたのですが、解決できません
でした。
何卒ご教授の程、宜しくお願いいたします。
記述しているコードは以下のものです。

Private Sub Form_Load()
    Text1.Text = "FF112233445566778899FF"
End Sub

Private Sub Command1_Click()
    Dim Read_Text   As String
    Dim bytdat()    As Byte
    Dim i           As Integer
    
    For i = 1 To LenB(Text1.Text) / 2
        Read_Text = Mid(Text1.Text, i, 2)
        bytdat() = Read_Text    '←この箇所を色々試したのですが...
        MScomm1.Output = bytdat
        i = i + 1
    Next i

End Sub


ガッ  2005-05-13 09:07:08  No: 121619

Val関数を使ってもいいし、自分でHexString→数値なる関数/配列を作ってもいいかと。


ゆうき  2005-05-13 09:07:15  No: 121620

すみません。環境を記述するのを忘れてました。
WindowsNT(SP6),VB6(SP6)です。
よろしくお願いします。


ゆうき  2005-05-13 09:23:19  No: 121621

ガッ様。
早速のご返答ありがとうございます。
明日、職場でやってみます。
(家にはVBありませんので)

ただ今日、データ変換のところで
  bytdat() = Hex(Read_Text)  
とやったら、「配列には割り当てられません」
と言われてしまったような気が...
これだけではダメなんですね。
明日もう一度試してみます。


ガッ  2005-05-13 09:29:20  No: 121622

MSDNに載っていますが、
Msgbox Val("&h12")などで、16進数表記→数値に直すことが出来ます。


ゆうき  2005-05-14 09:24:16  No: 121623

本日再度挑戦しました。
しかし解決できませんでした。
試しに以下のよううなコードを書き、試したのですが、
下記の場合ですと、作成された”test.bin”のファイルを
バイナリエディタで開くと、”46004600”と表示されてしまい
ます。バイナリエディタで開いても、”FF”と表示されるため
にはどのような変換を行えばいいのでしょうか?
ご指導の程、よろしくお願いいたします。

Private Sub Command1_Click()
    Dim Text_Data   As String
    Dim bytdat()    As Byte
    
    Text_Data = "FF"
    
    bytdat() = Hex(Val("&H" & Text_Data))
    
    Open "c:\test.bin" For Binary As #1
        Put #1, , bytdat
    Close #1
    
End Sub


ガッ  2005-05-14 11:54:51  No: 121624

※もっと型を意識しましょう。

> Private Sub Command1_Click()
>     Dim Text_Data   As String
>     Dim bytdat()    As Byte
>     
>     Text_Data = "FF"
>     
>     bytdat() = Hex(Val("&H" & Text_Data))
・Val("&H" & Text_Data)は内部形式DoubleのVariant型を返します。
・Hex(number)は内部形式StringのVariant型(多分)を返します。
・Byte()=Stringの式は、Stringの内部表現のバイト列をByte()にコピーするというものです。
よって、Hex(Val("&H" & Text_Data))は"FF"という文字列を返し、
bytdat()は"FF"という文字列のバイト列になります。

>     Open "c:\test.bin" For Binary As #1
>         Put #1, , bytdat
>     Close #1
>     
> End Sub
ココまで書いたら…ダイジョブだよね?


ゆうき  2005-05-15 08:40:54  No: 121625

すみません。
まだ、ダメです。
ここまでご親切にご指導いただき、まったく
情けないのですが、未だに解決できずにおります。

本日は、ガッ様のご指導から
>bytdat() = Hex(Val("&H" & Text_Data))
の、”HEX”の箇所が間違いの原因と認識し、
その箇所に、色々と代入し試したのですが、
どうもうまく動きませんでした。
(大抵、「配列には割り当てられません」と
  いわれてしまいます。)
全然見当違いのことをしているのでしょうか?
できれば、もう少しヒントをいただきたいのですが?


ガッ  2005-05-15 08:56:59  No: 121626

残念ながら、私が教えれるヒントはもう出し尽くしてしまいました。
酷いかもしれませんが、即席のソースコードで勘弁してください(orz

Function GetBytes(ByVal HexDecString As String) As Byte()
    
    '16進数表現の文字列を2文字ずつに区切り、
    'その表現に対応する数値の配列を返すメソッド。
    Dim i                                   As Long
    Dim Length                              As Long
    Dim ret()                               As Byte
    
    '入力の長さを求める
    Length = Len(HexDecString) \ 2
    
    If Length > 0 Then
        '入力がある場合だけ処理をする
        'retの初期化
        ReDim ret(1 To Length)
        
        'retに代入していく
        For i = 1 To Length
            ret(i) = Val("&h" & Mid$(HexDecString, (i - 1) * 2 + 1, 2))
        Next
    End If
    
    '戻り値を設定
    GetBytes = ret
    
End Function

※バグがあるかと思いますので、十分に注意してください。


id_rsa+  2005-05-15 09:01:07  No: 121627

Dim s As String
Dim b(1) As Byte

    s = "EEFF"    
    b(0) = Val("&H" & Mid$(s,1,2))
    b(1) = Val("&H" & Mid$(s,3,2))


ゆうき  2005-05-18 08:37:06  No: 121628

ガッ様、id_rsa+様
返信が遅くなり申し訳ありません。
おかげさまで無事解決する事が出来ました。
(あたりまえですね。回答を教えて頂いたのですから)
とにかく、このような稚拙な質問に長々とお付き合い
くださいまして、本当に有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加