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

Base64 Enc-> Dec後 1byte 増える

分類:[全般]

Base64でエンコード、デコードを繰り返すと1バイトずつファイルサイズが増加すする様です。増えない様にする方法があったら教えて下さい。

以下サンプルプログラム。

Private Sub base64Test(ByVal inFName As String, ByVal outFName As String)
Dim inFile As System.IO.FileStream
Dim bs() As Byte

inFile = New System.IO.FileStream(inFName, _
System.IO.FileMode.Open, System.IO.FileAccess.Read)
ReDim bs(inFile.Length)
Dim readBytes As Long = inFile.Read(bs, 0, inFile.Length)
inFile.Close()

Dim base64String As String
base64String = System.Convert.ToBase64String(bs)

Dim bs2() As Byte = System.Convert.FromBase64String(base64String)

Dim outFile As New System.IO.FileStream(outFName, _
System.IO.FileMode.Create, System.IO.FileAccess.Write)
outFile.Write(bs2, 0, bs2.Length)
outFile.Close()
End Sub
outFile.Write(bs2, 0, bs2.Length)

outFile.Write(bs2, 0, bs2.Length-1)
にするだけで良いのでしょうか?
> Base64でエンコード、デコードを繰り返すと1バイトずつファイルサイズが
> 増加する様です。増えない様にする方法があったら教えて下さい。

> ReDim bs(inFile.Length)

この部分で配列を1バイト分多く確保してしまっています。
VBの配列は0〜MAXの計(MAX+1)個分の要素が確保されますので、
ReDim bs(inFile.Length-1)のように修正すればOKだと思います。
ありがとう御座います。解決しました。

■No287に返信(よねKENさんの記事)
>>Base64でエンコード、デコードを繰り返すと1バイトずつファイルサイズが
>>増加する様です。増えない様にする方法があったら教えて下さい。
>
>> ReDim bs(inFile.Length)
>
> この部分で配列を1バイト分多く確保してしまっています。
> VBの配列は0〜MAXの計(MAX+1)個分の要素が確保されますので、
> ReDim bs(inFile.Length-1)のように修正すればOKだと思います。
>
解決済み!
もしやと思い確認したところ、私のサイトのVB.NETのサンプルが間違っていました。申し訳ありませんでした。

Base64形式の文字列に変換およびBase64形式の文字列から変換
http://dobon.net/vb/dotnet/string/base64.html

C#から変換する際に間違ったものと思われますが、メール受信のサンプルも同様のミスをしており、もしかしたら他のコードにも同じミスがあるかもしれません。発見されましたらご報告いただければ助かります。

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