DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字列のエンコードについて

環境/言語:[windows XP .NET Framework 2.0]
分類:[.NET]

Visual Basic 2005で、エンコード文字列をバイト型に変換しデコードする
FUNCTIONを下記の通り作成しました。


Private Function Base64_UTF8_Decode(ByVal str As String) As String
   Dim str_wk As String = str.TrimEnd
   Dim bytes As Byte() = System.Convert.FromBase64String(str_wk)
   str_wk = System.Text.Encoding.GetEncoding("UTF-8").GetString(bytes)
   Return str_wk
End Function


 しかし、上記FUNCTIONの3行目である
Dim bytes As Byte() = System.Convert.FromBase64String(str_wk)
の処理で、「Base-64 文字列に無効な文字が含まれています。」のエラーが
発生してしまいます。

 テストの際、3行目の変数str_wkに格納されている値に、「+ = ?」が
含まれていました。
そこで、これら3つの文字列を除いた値を変数str_wkに格納してテストしました。
その結果、取得すべき値は取得できませんでしたが、エラー無く実行できました。
しかし当然この結果は求める結果ではなく、問題の解決にはなっていません。

 自分で色々調べましたが、問題の解決法が分かりません。
本問題の解決法をご存知の方がいらっしゃいましたら、ご教示くださいますよう
お願いします。
ご質問を拝読しますと、単にBase64_UTF8_Decodeメソッドのパラメータstrに与えられた文字列が正しくないのが原因というように読み取れるのですが、違うのでしょうか?
確かに管理人さんの言うとおり、strに与えられた文字列が正しくないのが
原因のように思われるのですが、納得いかないのです。
なぜなら、下記C#の同様のメソッドで、正常に実行できている実績があるからです。

private string base64_utf8_Decode(string str)
{
  string str_wk = str.Substring(10,(str.Length -12));
  byte [] bytes = System.Convert.FromBase64String(str_wk);
  return str_wk = System.Text.Encoding.GetEncoding("UTF-8").GetString(bytes);
}


 今回私がVBで作成したメソッドは、上記C#のメソッドを参考に作成しました。
で、VBメソッドの呼び出し元は、
 Dim ID As String = Base64_UTF8_Decode(Mid(Request.ServerVariables("HTTP_ID"), 10))
です。
処理は、エンコードされたログインユーザの属性情報をデコードする、というものです。
上記C#のメソッドも、同様の処理で実績があります。
ちなみに、エンコードされた文字列は、「=?UTF-8?B?MDA=?=」であり、
上記VBメソッドの呼び出し元の結果は、「00」になるはずです。

 もうどうすれば解決できるか分かりません。
何か良い方法があれば、ご教示ください。
提示しているコードは両方とも実際のコードなんですよね?
だとしたら大元が同じ Base64 文字列でも、C# 版と VB.NET 版で str_wk に入る文字列が異なりませんか?
手元に環境がないので検証していませんが

C# 版 → MDA=
VB.NET 版 → MDA=?=

になると思うのですが。
> 提示しているコードは両方とも実際のコードなんですよね?
> だとしたら大元が同じ Base64 文字列でも、C# 版と VB.NET 版で str_wk に入る文字列が異なりませんか?

Geo=TK3さんのおっしゃるとおり、VB.NETのコードでは、SubstringがTrimEndになっていますね。

たぶんvermillionさんがやりたいことは、↓のようなことではないですか?

メールのサブジェクトをデコードする
http://dobon.net/vb/dotnet/internet/decodemailsubject.html
管理人さん、Geo=TK3さん、おはようございます。

 前回の管理人さんのご回答内の下記内容、
> メールのサブジェクトをデコードする
> http://dobon.net/vb/dotnet/internet/decodemailsubject.html
を参照し、コーディングし直した結果、正常に値取得することが出来ました!

 VBは経験あるのですが、VB.NET(VB2005)自体、数ヶ月前から独力で
見よう見まねでこれまでやってきました。まだまだ解らないことだらけで、
今回の問題も正直マイってました。

 でも、お二人にご教示頂き、問題を解決することができました。
本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板