none
vb6とvb.netでの改行コードとバイト変換について RRS feed

  • 質問

  • 開発環境はWin7 Pro 、VS2013、.NEt FrameWork4、VB6、VB.NET です

    ------------------------------pDataへの格納方法----------------------------

    pData = pData & Chr(&H22) & ")" & vbCrLf
    pData = pData & "CallFile(" & Chr(&H22) & "PRINT.MAS" & Chr(&H22) & ")" & vbCrLf

    ------------------------------vb6でのpDataをイミディエイトウィンドウで見た場合----------------------------

    EntryFile("PRINT.MAS",797,"StatusSet('0')
    StatusSet('0')
    Eraser
    PrintText(1,300,12,1,1,1,"0123")
    Exit(1)
    PrintStart(0)
    StatusSet('b')
    ")
    CallFile("PRINT.MAS")

    --------------------------------VB.NETでのpDataをイミディエイトウィンドウで見た場合----------------------------------

    "EntryFile("PRINT.MAS",797,"StatusSet('0')  StatusSet('0')  Eraser  PrintText(1,300,12,1,1,1,"0123")  Exit(1)  PrintStart(0)  StatusSet('b')  ")  CallFile("PRINT.MAS")  "

    --------------------------------VB6----------------------------------

        s = StrConv(pData, vbFromUnicode)
        TxdSize = LenB(s)
        If TxdSize > 0 Then
            ReDim txbuf(TxdSize - 1)
            For l = 1 To TxdSize
                txbuf(l - 1) = AscB(MidB(s, l, 1)) 
                'Debug.Print txbuf(l - 1)
            Next
        End IF

    --------------------------------VB.NET----------------------------------

                TxdSize = LenB(pData)
                If TxdSize > 0 Then
                    ReDim txbuf(TxdSize - 1)
                    Dim j As Integer = 0
                    For l = 0 To TxdSize - 1
                        Dim by As Byte

                        Do
                            If l + j > UBound(System.Text.UnicodeEncoding.Unicode.GetBytes(pData)) Then
                                Exit Do
                            End If
                            by = System.Text.UnicodeEncoding.Unicode.GetBytes(pData)(l + j)
                            If by = 0 Then
                                j += 1
                            Else
                                txbuf(l) = System.Text.UnicodeEncoding.Unicode.GetBytes(pData)(l + j)
                                Exit Do
                            End If
                        Loop
                    Next
                End If

    pDataの中身をイミディエイトウィンドウで見ると、VB6は上記に貼り付けたと同様に出力されますが、VB.NETは改行されず、空白文字?のような値が追加されているだけで改行表示されていません。

    そして、最も困っているのが文字列をバイト変換して取り出そうとしておりますが、VB.NETの場合、途中で0バイトが混じっており結果が変わりっております

    VB.NETで変なDo文とIF文が混じっているのは0バイトを弾いて取得すれば何とかなるかと思い試してみましたが、0バイトが混じっている以外にも一部値が違っております。

    そこでご教示して頂きたいのは、下記2点で御座います。

    ①pDataに格納する際にVB6とVB.NETで同じやり方で良いのか?※VSのバージョンで表示が違うだけかもしれませんが、見た目が違うので気になります

    ②VB6とVB.NETで同じ値の取得の仕方

    非常に長い間煮詰まっており、どうにも自分で打開策が見いだせず困っております。

    どうかお力を貸して頂き度、何卒宜しくお願い申し上げます。


    • 編集済み kong0214 2014年9月3日 12:17
    2014年9月3日 12:16

回答

  • VB6 と VB.NET は別物だと考えていただいた方がよいでしょう。

    たとえば、System.Text.UnicodeEncoding.Unicode.GetBytes を何回も呼び出していますが、本来、これは1度の呼び出しでよいはずです。
    一度呼んだ結果を変数に入れておけば何回もバイト変換の必要はないはずです。

    さらに書くと、そもそもこのループ自体が不要です。
    VB6 はバイト配列への変換のためにループが必要だったのかもしれませんが、VB.NET では System.Text.UnicodeEncoding.Unicode.GetBytes 自体がバイト配列を返すので、この結果を txBuf の代わりに使えばよいはずなので。

    さて、System.Text.UnicodeEncoding.Unicode の意味は調べましたか?
    これを使う場合、文字列を UTF-16 のバイト表現にするわけですから、半角英数と言った ASCII 文字であろうと必ず 2 バイトの表現になります。
    つまり、あなたが求めるものではないはずです。検索して得たものをそのままくっつけるような形でコーディングされているのであれば、ほかに問題を含んだコードになっている可能性があります。それぞれ意味をきちんと理解するようにしてください。

    // 今回の場合、Encoding.ASCII じゃないですかね。絶対とは言えませんが。

    • 回答としてマーク kong0214 2014年9月3日 23:57
    2014年9月3日 13:43
    モデレータ
  • 昔のVB6の頃のイミディエイトウィンドウとは動作が変わっています。その為、文字列を出力させようとすると改行しない状態にして表示されるようになっています。
    他にもイミディエイトウィンドウの前の行に戻ってやり直すといったこともできなくなってます。
    これは、デバッグ中にメニューのデバッグ->ウィンドウ->ローカルもしくは自動変数やウォッチで表示されるウィンドウが代わりになります。
    確認したい変数(今回ならpData)の値の列の右端に虫眼鏡みたいなものが表示されているので、それをクリックすると文字列の全体を見ることができます。

    文字列をバイト配列にするのは惜しいところまでできています。
    それはSystem.Text.UnicodeEncoding.Unicode.GetBytesで、この意味は文字列をUnicodeのバイト配列に変換するという命令なのです。
    ですから、Unicodeの部分を変換したい文字エンコードにすればいいのではと推測できますよね。実際にそのようになっていて、、

    Dim bytes() As Byte
    bytes = System.Text.Encoding.ASCII.GetBytes(pData) 'ASII文字に変換したバイト配列
    bytes = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(pData)'S-JISに変換したバイト配列

    という簡単な命令で文字列をバイト配列にしてしまうことができます。
    目的のエンコードが標準でない場合はGetEncodingで得ることになります。(可能なエンコード一覧はEncodingの説明に一覧があります。)

    #全角文字が混ざってるのでASCIIではないもよう


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク kong0214 2014年9月3日 23:57
    2014年9月3日 13:59

すべての返信

  • VB6 と VB.NET は別物だと考えていただいた方がよいでしょう。

    たとえば、System.Text.UnicodeEncoding.Unicode.GetBytes を何回も呼び出していますが、本来、これは1度の呼び出しでよいはずです。
    一度呼んだ結果を変数に入れておけば何回もバイト変換の必要はないはずです。

    さらに書くと、そもそもこのループ自体が不要です。
    VB6 はバイト配列への変換のためにループが必要だったのかもしれませんが、VB.NET では System.Text.UnicodeEncoding.Unicode.GetBytes 自体がバイト配列を返すので、この結果を txBuf の代わりに使えばよいはずなので。

    さて、System.Text.UnicodeEncoding.Unicode の意味は調べましたか?
    これを使う場合、文字列を UTF-16 のバイト表現にするわけですから、半角英数と言った ASCII 文字であろうと必ず 2 バイトの表現になります。
    つまり、あなたが求めるものではないはずです。検索して得たものをそのままくっつけるような形でコーディングされているのであれば、ほかに問題を含んだコードになっている可能性があります。それぞれ意味をきちんと理解するようにしてください。

    // 今回の場合、Encoding.ASCII じゃないですかね。絶対とは言えませんが。

    • 回答としてマーク kong0214 2014年9月3日 23:57
    2014年9月3日 13:43
    モデレータ
  • 昔のVB6の頃のイミディエイトウィンドウとは動作が変わっています。その為、文字列を出力させようとすると改行しない状態にして表示されるようになっています。
    他にもイミディエイトウィンドウの前の行に戻ってやり直すといったこともできなくなってます。
    これは、デバッグ中にメニューのデバッグ->ウィンドウ->ローカルもしくは自動変数やウォッチで表示されるウィンドウが代わりになります。
    確認したい変数(今回ならpData)の値の列の右端に虫眼鏡みたいなものが表示されているので、それをクリックすると文字列の全体を見ることができます。

    文字列をバイト配列にするのは惜しいところまでできています。
    それはSystem.Text.UnicodeEncoding.Unicode.GetBytesで、この意味は文字列をUnicodeのバイト配列に変換するという命令なのです。
    ですから、Unicodeの部分を変換したい文字エンコードにすればいいのではと推測できますよね。実際にそのようになっていて、、

    Dim bytes() As Byte
    bytes = System.Text.Encoding.ASCII.GetBytes(pData) 'ASII文字に変換したバイト配列
    bytes = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(pData)'S-JISに変換したバイト配列

    という簡単な命令で文字列をバイト配列にしてしまうことができます。
    目的のエンコードが標準でない場合はGetEncodingで得ることになります。(可能なエンコード一覧はEncodingの説明に一覧があります。)

    #全角文字が混ざってるのでASCIIではないもよう


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク kong0214 2014年9月3日 23:57
    2014年9月3日 13:59
  • 参考プログラムがUnicode変換だったので、VB.NETでも同じようにやるべきだと頭が凝り固まっていました。

    全角、半角を個別にチェックし、現行の変換には何が必要なのかを1つ1つ検証した結果、

    shift_jis変換でないとダメだという事が分りました。

    前回質問させて頂いた時も非常に的確なアドバイスを頂いたのですが、今回も非常に助かりました。

    また、Azuleanさんのおっしゃる通り、ループは必要ありませんでした。

    こちらも修正させて頂きました。

    お二方のお掛けで御座います、本当に有難うございます。

    2014年9月5日 6:58