2009-04-02 190 views
13

Base64の無効な文字エラーが発生しても、私は続けていません。Base64文字列が無効な文字エラーを投げる

プログラムはXMLファイルを取り込み、それをドキュメントにエクスポートします。ユーザーが望む場合は、ファイルも圧縮されます。圧縮は正常に動作し、UTF-8にエンコードされてファイルに書き込まれるBase64 Stringを返します。

私はその圧縮されたかどうかを確認する必要がプログラムに文書を再ロードするためにその時間は、コードは単純です:

byte[] gzBuffer = System.Convert.FromBase64String(text); 
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray()); 

それはそれはGZipsコードを持っているかどうかを確認するために、文字列の先頭をチェックしますその中に。

今、すべてのテストが機能します。私は文字列を取り、それを圧縮し、解凍し、それをオリジナルと比較します。問題は、ADOレコードセットから返された文字列を取得する場合です。文字列はファイルに書き込まれたものです(最後に "\ 0"が追加されていますが、何もしないと思っています。私はさらに文字列全体をコピーしてテストメソッドに貼り付け、それを圧縮/解凍します。正常に動作します。

テストは合格しますが、コードは全く同じ文字列を使用して失敗しますか?唯一の違いは、通常の文字列を宣言して渡す代わりに、レコードセットから返される文字列を取得することです。

私は何が間違っているのかに関するアイデアはありますか?

+0

Convert.FromBase64Stringに渡す文字列の例を投稿すると助けになるでしょう(例えば、呼び出しの直前にDebug.Writeを置くと出力に出るもの) –

+0

... even最初と最後の8バイト、および文字列の長さを投稿した場合、その文字列が正しい形式であることがわかります。 –

+0

qGcAAB + LCA ... cAAA == その長さは2376文字です。 – Brandon

答えて

15

あなたは、文字列をファイルに を書かれたまさにです

言う(末尾の 「\ 0」を追加したが、私も何もないこと を考えていません) 。実際に

、それが何かを(それがFormatExceptionスローするようにあなたのコードを引き起こし:「Base64文字列に無効な文字」)を行うんConvert.FromBase64Stringが有効なのBase64文字として「\ 0」を考慮していないので、 。

byte[] data1 = Convert.FromBase64String("AAAA\0"); // Throws exception 
    byte[] data2 = Convert.FromBase64String("AAAA"); // Works 

解決策:ゼロ終了を取り除きます。(たぶん.Trim("\0")を呼び出す)

ノート

MSDN docs for Convert.FromBase64Stringは、それが空白に 文字を無視して

秒の長さは、ゼロまたは複数のではないFormatExceptionときスローされますと言う

の4

-または

sの形式が無効です。 sには、基数64以外の文字が含まれています。 は2つのパディング文字、 は空白文字で、 のパディング文字のうちの1つです。昇順に

その

ベース64桁がゼロから は大文字、小文字 'Z' に ' 、数字' 'Z' に 'A' であります0 'から' 9 '、 の記号「+」および「/」を含む。

+0

私は\ 0オフをトリム、それはまだスローされます。 – Brandon

+0

それでもFormatExceptionなどがスローされますか? FromBase64Stringに渡される正確な文字列は何ですか? –

+0

正確な文字列はポストするのに少し時間がかかります。私は知らないサイズの制限はありますか?しかし、有効なものは何ですか、私はBase64で許可されていない文字をチェックしました。たぶん私はちょうど間違ったトリムをしましたが、それはテストがうまく動作している理由を説明していません。 – Brandon

3

null charが許可されるかどうかは、問題のBase64コーデックに依存します。 Base64標準のぼんやりしている(正確な仕様はありません)、多くの実装では空白として無視されます。そして、他の人はそれを問題としてフラグを立てることができます。そして、バグを発見した人はそれに気付かず、うまく解読しようとしませんでした。 -/

しかし、C#の実装はそれが好きではないと聞きます(これは有効なアプローチです)。

少し追加のコメント:UTF-8は必須ではなく、ISO-8859-x別名Latin-x、および7ビットAsciiも同様に機能します。これは、Base64が、7ビットのascii互換エンコーディングで動作する7ビットサブセットのみを使用するように特別に設計されているためです。

0

文字列の最後から\ 0を削除することができない場合は、エンコードする各文字列に独自の文字を追加し、デコード時にその文字を削除することができます。

0

Base64の文字列からの変換には、変換関数の中に前述の "data:image/jpg; base64"を使用するものと、実際のデータのみを使用するものがあります。

関連する問題