bytData() = "02 54 58 54 88 82 82 30 30 30 31 30 30 03"
上記のバイト配列を文字列にするにはどうすれば良いでしょうか?
StrConv(bytData, vbUnicode)を使うと5バイト目からの"88 82 82"が
正しく変換できませんでした。
また、変換後の文字列からMidB(〜, 8, 3)を使って"000"を取得できますか?
VB6/WinXP
> bytData() = "02 54 58 54 88 82 82 30 30 30 31 30 30 03"
単純に「Byte()にStringを入れているだけ」なら、
debug.? CStr(bytData)
とすると、Byte()→Stringがされて "02 54 58 .. 03"が表示されます。
そうではなく、
bytData(LBound(bytData)+0)=2
bytData(LBound(bytData)+1)=54
bytData(LBound(bytData)+2)=58
..
というのなら、この掲示板などでADODB.Streamについて調べてください。
※どんな文字列なんだろう…
ちょっとバイナリエディタに 02 54 .. 03 を書いてみました。
これってもしかして、文字列と文字列以外のデータが混ざったものなのではないでしょうか?
そういった場合は、全て一括に文字列に変換させるのではなく、
ちゃんとフォーマットに則って「○〜×までは数値、×+1〜△までは文字列…」という区切りを以って処理するのが普通だと思います。
また、書きそびれましたが、
> 変換後の文字列からMidB(〜, 8, 3)を使って"000"を取得できますか?
これはできません。
VB6のStringの内部表現は2バイトを1文字として扱うものなので、
3バイトだけ切り取って3文字になることは無いからです。
説明不足ですみません。
bytData()に入っているデータは以下のようになっています。
bytData(0) = CByte(&H02)
bytData(1) = CByte(&H54)
bytData(2) = CByte(&H58)
bytData(3) = CByte(&H54)
...
このバイト配列を文字列にするとbytData(4) 〜 bytData(6)にあたる部分が
正しい値になっていませんでした。
#文字列にしたデータをバイナリでファイルに書き出して確認しました。
>ガッさん
このバイト配列は通信用のデータで、5バイト目から3バイト分が相手機器の
ステータスが入っています。それ以外はアスキーコードです。
データを区切って処理したほうが良いですよね…
その方法で検討してみます。
#String型でバイトの処理をするのが間違いなんですね。
ツイート | ![]() |