tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列時の書き方に関して
記事No11160
投稿日: 2013/09/21(Sat) 23:26
投稿者ミスターK
Public Function gf_GetValue(ByRef strData As String, ByRef aFields() As typDatFields, ByRef astrDat() As String) As Boolean

Dim lngLenB As Integer
Dim lngPosB As Integer
Dim lngIx As Integer

lngMx = UBound(aFields)
ReDim astrDat(lngMx)

astrDat(lngIx) = StrConv(MidB$(bytDataCnv, .lngPosB, .lngLenB), vbUnicode) ※
astrDat(lngIx) = Trim$(astrDat(lngIx))

VB6.0のプログラムをVB.NETへ移行しているのですが、※の行を以下のように書き換えました
→astrDat(lngIx) = System.Text.Encoding.Unicode.GetBytes(Mid(strData, .lngPosB, .lngLenB))
→上記のように変更したところ、
 「型 'Byte' のの1次元配列の値を 'String' に変換できません。」というエラーが出ます。
どう書けばいいのでしょうか?
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: 配列時の書き方に関して
記事No11161
投稿日: 2013/09/22(Sun) 16:55
投稿者魔界の仮面弁士
> ※の行を以下のように書き換えました
対応する関数が無いからとはいえ、VB6 の MidB$ 関数を、VB.NET の Mid 関数に
置き換えてはいけません。VB6 の Mid$ 関数を VB.NET Mid 関数に置きかえるなら良いですが。


> →astrDat(lngIx) = System.Text.Encoding.Unicode.GetBytes(Mid(strData, .lngPosB, .lngLenB))
bytDataCnv と strData の関係を説明してもらわないと、意図が読み取れないです。

VB6 の方は、「Shift_JIS バイナリ(の一部)を、文字列に変換するコード」なのに、
VB.NET の方は、「文字列(の一部)を、Unicode バイナリに変換するコード」に
置き換えているようですが、そもそも gf_GetValue 関数で何をさせたいのでしょうか?


> Dim lngLenB As Integer
変数名のプレフィックスが型名と一致していません。
典型的な「システムハンガリアンの弊害」ですね…。


> VB6.0のプログラムをVB.NETへ移行しているのですが
変数宣言が「lngLenB」「lngPosB」と書かれているも関わらず、
コードでは「.lngPosB」「.lngLenB」という With 的表現が使われて
いることから推察するに、これは実際のコードでは無いのですよね。


とりあえず、

・bytDataCnv は Shift_JIS のバイナリ を格納した Byte 型の一次元配列
・lngPosB は、バイナリの切り出し開始位置(1〜)を示す Long 値
・lngLenB は、切り出すバイト長(0〜)を示す Long 値
・MidB$ 関数を使って、Shift_JIS バイナリの一部を切り出す
・astrDat(lngIx) には、切り出したバイナリを Unicode 変換して String として格納する

という意図だと推察しますが、それならば
 astrDat(lngIx) = System.Text.Encoding.GetEncoding(932).GetString(bytDataCnv, lngPosB - 1, lngLenB)
と書いてみてください。

「.GetEncoding(932)」の部分は「.GetEncoding("Shift_JIS")」とも書けます。
(.Default を使う事もできますが、その場合、日本語OS以外での動作が異なります)

bytDataCnv が シフトJIS のバイナリなので、Encoding も Shift_JIS を指定しています。
bytDataCnv が UTF-16 のバイナリの場合は、Encoding を Unicode にしてください。

[ツリー表示へ]
タイトルRe^2: 配列時の書き方に関して
記事No11165
投稿日: 2013/09/25(Wed) 21:56
投稿者ミスターK
丁寧な解説、回答ありがとうございました。
大変参考になりました。


> > ※の行を以下のように書き換えました
> 対応する関数が無いからとはいえ、VB6 の MidB$ 関数を、VB.NET の Mid 関数に
> 置き換えてはいけません。VB6 の Mid$ 関数を VB.NET Mid 関数に置きかえるなら良いですが。
>
>
> > →astrDat(lngIx) = System.Text.Encoding.Unicode.GetBytes(Mid(strData, .lngPosB, .lngLenB))
> bytDataCnv と strData の関係を説明してもらわないと、意図が読み取れないです。
>
> VB6 の方は、「Shift_JIS バイナリ(の一部)を、文字列に変換するコード」なのに、
> VB.NET の方は、「文字列(の一部)を、Unicode バイナリに変換するコード」に
> 置き換えているようですが、そもそも gf_GetValue 関数で何をさせたいのでしょうか?
>
>
> > Dim lngLenB As Integer
> 変数名のプレフィックスが型名と一致していません。
> 典型的な「システムハンガリアンの弊害」ですね…。
>
>
> > VB6.0のプログラムをVB.NETへ移行しているのですが
> 変数宣言が「lngLenB」「lngPosB」と書かれているも関わらず、
> コードでは「.lngPosB」「.lngLenB」という With 的表現が使われて
> いることから推察するに、これは実際のコードでは無いのですよね。
>
>
> とりあえず、
>
> ・bytDataCnv は Shift_JIS のバイナリ を格納した Byte 型の一次元配列
> ・lngPosB は、バイナリの切り出し開始位置(1〜)を示す Long 値
> ・lngLenB は、切り出すバイト長(0〜)を示す Long 値
> ・MidB$ 関数を使って、Shift_JIS バイナリの一部を切り出す
> ・astrDat(lngIx) には、切り出したバイナリを Unicode 変換して String として格納する
>
> という意図だと推察しますが、それならば
>  astrDat(lngIx) = System.Text.Encoding.GetEncoding(932).GetString(bytDataCnv, lngPosB - 1, lngLenB)
> と書いてみてください。
>
> 「.GetEncoding(932)」の部分は「.GetEncoding("Shift_JIS")」とも書けます。
> (.Default を使う事もできますが、その場合、日本語OS以外での動作が異なります)
>
> bytDataCnv が シフトJIS のバイナリなので、Encoding も Shift_JIS を指定しています。
> bytDataCnv が UTF-16 のバイナリの場合は、Encoding を Unicode にしてください。

[ツリー表示へ]