0

私がする必要があるのは、javaからc#にファイルを送信することです。一方、Javaはクライアントとして機能し、C#はサーバーとして機能します。

ファイルはfileinputstreamを介してJavaにロードされ、utf8、次にbase64に変換されます。コードを参照してください。

FileInputStream fin=new FileInputStream(fileName);
          byte[] content = new byte[fin.available()];
          fin.read(content, 0, content.length);
          String asString = new String(content, "UTF8");
          byte[] newBytes = asString.getBytes("UTF8");
          String base64 = Base64.encodeToString(newBytes, Base64.DEFAULT);

サーバーは(c#言語を使用して)送信されたデータを読み取り、ファイルとして変換し直します。私はbase64を使用してからutf8に移動し、最後にそれを作成する方法がわかりません。送信しようとしているのは、144kb以下のvideo.mp4サイズです。これまでのところ、出力には「WRONGFORMAT」のキャッチが表示されています。コードを参照してください。

    try
            {

                for (int i = 0; i <= _server.Q.NoOfItem - 1; i++)
                {
                    words = _server.Q.ElementAtBuffer(i).ToString();
                    //textBox1.Text = words;


                    byte[] encodedDataAsBytes = System.Convert.FromBase64String(words);
                    string returnValue = System.Text.Encoding.UTF8.GetString(encodedDataAsBytes);

                    textBox1.Text = returnValue;

                }
}
            catch (ArgumentNullException argNull) 
            {
                textBox1.Text = "Received null value";
            }
            catch (FormatException FrmtEx)
            {
                textBox1.Text = "Wrong format";
            }

for (int i = 0; i <= _server.Q.NoOfItem - 1; i++)これは、送信されたデータをキャプチャ/取得する方法であるため、無視してかまいません。

p / s:ファイルをロードせずに文字列を渡そうとした場合(string >> utf8 >> base64)および受信しようとした場合(base64 >> utf8 >> string)に機能します。

4

2 に答える 2

2

ファイルはfileinputstreamを介してJavaにロードされ、utf8に変換されます

その後、データを失いました。ビデオデータはテキストデータではないため、テキストデータとしてロードしないでください。バイナリデータとして扱います-どこかで文字列として表す必要がある場合は、必ずbase64にエンコードしますが、テキストのデコードは実行しないでください。これは、エンコードされたテキストデータのみを対象としているためそうではありません。

ここで何が悪いのかを理解することは本当に重要です。以下の2行でできることは、データを失うことだけです。データを失わない場合、それらは目的を果たしません-そして、データを失う場合、それらは明らかに悪い考えです:

String asString = new String(content, "UTF8");
byte[] newBytes = asString.getBytes("UTF8");

そもそも、どのようにしてこのコードにたどり着いたのかを分析する必要があります...なぜバイト配列を文字列に変換して戻す必要があると感じたのですか?

jowierunの答え正しいです-あなたはまったく使用すべきではありませんavailable()。ファイル全体を一度にメモリに読み込む必要がある場合など、Guavaのユーティリティメソッドを使用することをお勧めします。Files.toByteArray

p / s:ファイルをロードせずに文字列を渡そうとした場合(string >> utf8 >> base64)および受信しようとした場合(base64 >> utf8 >> string)に機能します。

はい、テキストデータから始めれば、それで問題ありません。UTF-8はすべての有効な文字列を表すことができ、base64はロスレスなので、問題ありません。(確かに、サロゲートペアの半分で無効な文字列を提示することでそれを破ることができますが...)問題は、最初に非テキストデータをテキストとして扱う点にあります。

于 2012-10-04T06:10:38.307 に答える
0

fin.available()一度にファイルを読み取ることができると想定するために使用するべきではありません。これは、小さなファイルに対してのみ機能する可能性があります。代わりに、ループで読み取りを実行し、エンコードする前にすべてのコンテンツをまとめる必要があります。

(少なくともJava側では)エンコードが機能していることをテストするために使用できるルーチンをデコードすることは理にかなっています(おそらく単体テストですか?)。あなたはおそらくあなたが得ている問題と一貫してテストが失敗していることに気付くでしょう。

于 2012-10-04T06:04:27.393 に答える