3

エンコードとデコードには多くの種類があることを知っています。私が読んだことから、バイナリファイル(画像、mp3、ビデオ)のエンコードに関してはbase64が最適です。

さて、デコードに関しては、base64 から変換してから文字列値を取得する必要があります。デコード後に文字列を取得するプロセスは、次のようにする必要があります (C# で):System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

ここで、文字列を取得するために何を使用するかについて、ASCII、UNICODE、DEFAULT など、いくつかの選択肢があることに気付きました。

この投稿での本当の問題は、Java を使用してバイナリ ファイルをエンコードし、C# を使用してバイナリ ファイルをデコードする場合、どのソリューション/選択肢を使用する必要があるかということです。いくつかの方法を試しましたが、一部の文字が読み取れなかったため、疑問符記号 (?) が表示されました。

ただし、バイトを読み取ることができる最も近いエンコード デコードは、Java でこれを使用する場合です。String encoded = Base64.encodeToString(fileData, Base64.CRLF);一方、C# では次のように使用します。byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); string returnValue = System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

それでも読めない文字がいくつかあります。この問題文の解決策はありますか? フィードバックは大歓迎です。事前に感謝します。

4

4 に答える 4

4

あなたはその入力が「画像、mp3、ビデオ」であると述べているので、任意のバイナリです。次に、base-64を使用していることを示します。つまり、何らかの理由で、このデータを文字列として転送/保存する必要があります(注:通常、生のバイナリとして転送/保存することをお勧めします-base-64にはオーバーヘッドがあります)。

さて、デコードに関しては、base64から変換してから、文字列値を取得する必要があります。

問題があります。ここには文字列値はありません。「画像、mp3、ビデオ」は単に「文字列値」ではありません。実行できるのは、base-64からrawバイナリ(javaまたはc#のいずれかで簡単)にデコードすることですが、実行できるのはそれだけです。生のバイナリからの「文字列値」が必要な場合、実行できる唯一のことは、base-64(最初に使用したものを返す)または他のbase-nを介して再エンコードすることです。

ASCIIやUTF-8などのテキストエンコーディングは、バイナリデータが実際にそのエンコーディングに格納されているテキストデータであることがわかっている場合にのみ意味があります。UTF-8を使用して、実際にはUTF-8ではないバイナリを「デコード」することはできません。

于 2012-10-12T07:28:35.450 に答える
1
  1. 文字列オブジェクト(JavaまたはC#)を、UTF-8(または理由がある場合はその他)エンコーディングを使用してバイト配列に変換します。
  2. これで、バイナリデータ、具体的にはUTF-8でエンコードされたテキストができました。生のバイナリデータやUTF-8テキストをサポートしていない場所に転送する必要がある場合、またはXMLのように特別な意味を持つ文字について心配したくない場合は、base64エンコーディングを使用してASCII文字列に変換します
  3. ASCII文字列(base64では空白のマングリングなども可能)を使用して、デコーダーに取得するために必要なことを実行します。
  4. ASCII文字列をbase64デコードを使用してバイト配列に変換し直します
  5. UTF-8エンコーディングを使用して、バイト配列を文字列オブジェクト(C#またはJava)に変換し直します

バイナリデータまたはUTF-8テキストに問題がない場合は、手順2と4をスキップできます。ただし、C#やJavaなどの言語では、文字列は「論理文字」であり、保存または転送できるバイトではないため、1と5が必要です。 (もちろん、メモリ内のバイト、通常はUTF-16またはUTF-32ですが、気にする必要はありません)。何らかのエンコーディングを使用してバイトに変換する必要があります。UTF-xは文字を失うことのない唯一のものであり、ほとんどの文字が「西部」のアルファベットからのものである場合、UTF-8は最もスペース効率が良いです。

base64の特別な点の1つは、実際には7ビットASCII文字ですが、使用中のすべての文字列エンコーディングがスーパーセットであるため、base64でエンコードされたテキストをC#/ Java文字列オブジェクトに配置し、任意の文字列エンコーディングを使用してbase64でエンコードされたバイト配列に戻すことができることです。 7ビットASCIIの。したがって、画像データを取得し、base64でエンコードして、エンコードや破損を心配することなく、結果のテキストをStringオブジェクトに配置できます。

バイナリファイルの手順:

  1. PNG画像ファイルのようなバイナリファイルの内容をバイト配列に取得します。
  2. データがUTF-8でないことを除いて、上記の手順2と同じです。
  3. 上記のステップ3と同じ
  4. 上記のステップ4と同じ
  5. これで、手順1のPNGファイルの内容を含むバイト配列ができました。
于 2012-10-12T07:34:28.357 に答える
1

データをデコードした後に文字列を取得する場合は、データがテキスト形式であることを意味します。この場合、UTF-8 などのファイルの初期エンコーディングに関する知識が必要です。その後、文字列を適切にデコードできます。あなたのプログラムがコンテンツを何もせずにある場所から別の場所にファイルを転送するだけの場合は、デコードするときにファイルをそのままにしておく方がよいでしょう。

于 2012-10-12T07:28:55.117 に答える