2016-11-17 6 views
1

私はベース64のエンコードされた値を持っています。デコードされた値のエンコーディングを知らずに、この値を使ってデコードされた値の長さを知りたいと思います。デコードされた値のエンコーディングを知らなくても、base64でエンコードされた値の長さを判断する方法はありますか?

たとえば、「foo」のベース64エンコード値は、Zm9vです。このようにデコードすると:

var bytes = Convert.FromBase64String("Zm9v"); 

私は3バイトの配列を取得します。この場合、私は簡単に3ような長さを決定しますが、我々はベース64に「= w7w」である値として「ü」を持っているとしましょうことができます。

// length = 2 
var bytes = Convert.FromBase64String("w7w="); 

バイト配列の長さを一般的に再び使用されるが、私はこれがUTF8として働くだろうと思います

var lenght = Encoding.UTF8.GetString(bytes).Lenght; 

:最初のソリューションが失敗したので、私は考えて、他のオプションはUTF8エンコーディングを使ってバイトから文字列を取得し、長さを取得することで、2です私は快適ではないwこの解決法のいずれか。これについてどうすればいいですか?最初の価値のコード化を知らなくても、これに対する一般的な解決策を見つけることは不可能でしょうか?その後、代わりにバイトの長さを得るための

+2

しかし、あなたはエンコーディングを知らなくても、任意のバイト配列をデコードすることができれば、あなたは、本質的に求めています。 – Evk

答えて

2

あなたがエンコーディングを持っていない場合。 1000バイトのBLOBは、500文字のUnicodeまたは1000文字のASCII文字列です。エンコーディングなしではあなたは決して知りません。

0

、それを文字列に変換し、文字列の長さを取得する:あなたはバイト配列から文字列の長さを知ることができない

var bytes = Convert.FromBase64String("w7w="); 
int length = Encoding.UTF8.GetString(bytes).Length; 

DEMO

+1

私はこの質問に言及しましたが、値にUTF8で表現できない文字が含まれていると正しく動作するとは思われません。 –

+0

@SelmanGençbey、私はそうは思わない、あなたは例を与えるだろうか? –

+0

@SelmanGenç私の答えのデモを見て –

1

ここには2つの問題がありますが、簡単なものと(一般的な場合の)不可能なものがあります。

簡単な方法は、base64文字列でエンコードされたバイト数を取得することです。これは、実際には、base64文字列の文字数と最後に何文字あるかを調べて、デコードを実行せずに行うことができます。

一般的に不可能なのは、任意のバイトシーケンスでエンコードされた文字数を取得することです。 は文字数がエンコードに依存しており、正しくを推測しているのでのエンコーディングは、常に不可能です。。この私が抜粋されますが、問題は、時々the Notepad file encoding problemとして知られている、とレイモンドチェンは私ができるよりもはるかに良いが、それを説明している:

例えば

を、このファイルを考えてみましょう。

D0 AE 

あなたをコードしているに応じて、あなたは非常に異なる 結果を得ると仮定します。

  • あなたが(コードページ1252付)8ビットのANSIを想定した場合、そのファイルは、2つの文字U + 00D0 U + 00AE、または "Ю" で構成されています。これは確かに と思われますが、おそらくそれはVATNI®という単語の一部です。これは アイスランドのホテルの名前です。

  • UTF-8と仮定すると、ファイルは単一のキリル文字U + 042Eまたは "Ю"で構成されます。

  • Unicodeビッグエンディアンを想定している場合、ファイルは韓国語のハングルの音節U + D0AEまたは "킮"で構成されています。

  • Unicodeリトルエンディアンと仮定すると、ファイルは韓国語のハングルの音節U + AED0または "ใ"で構成されます。

関連する問題