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 大小。到目前为止,输出显示了“错误格式”的捕获。看代码。

    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:当我只是试图传递任何字符串而不加载文件(字符串 >> utf8 >> base64)并接收(base64 >> utf8 >> 字符串)时,它可以工作。

4

2 回答 2

2

该文件通过fileinputstream在java中加载并转换为utf8

然后你丢失了数据。视频数据不是文本数据,所以不要将其作为文本数据加载。将其视为二进制数据 - 如果您需要在某处将其表示为字符串但对它执行任何文本解码,请务必将其编码为 base64,因为这仅适用于编码的文本数据,而事实并非如此。

了解这里出了什么问题非常重要。下面两行唯一能做的就是丢失数据。如果他们不丢失数据,他们将毫无用处 - 如果他们确实丢失了数据,他们显然是个坏主意:

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

你应该首先分析你是如何得到这段代码的......为什么你觉得需要将字节数组转换为字符串并返回?

jowierun 的回答也是正确的——你根本不应该使用available()。您可能想要使用来自Guava的实用方法,例如,Files.toByteArray如果您确实需要一次性将整个文件读入内存。

p/s:当我只是试图传递任何字符串而不加载文件(字符串 >> utf8 >> base64)并接收(base64 >> utf8 >> 字符串)时,它可以工作。

是的 - 如果你文本数据开始,那很好 - UTF-8 可以表示每个有效字符串,并且 base64 是无损的,所以你很好。(诚​​然,您可以通过使用代理对的一半呈现无效字符串来破坏它,但是......)问题在于您首先将非文本数据视为文本。

于 2012-10-04T06:10:38.307 回答
0

您不应该fin.available()假设您可以一口气读取文件。这可能只适用于小文件。相反,您需要循环读取并在编码之前将所有内容收集在一起。

(至少在 java 方面)有一个解码例程是有意义的,您可以使用该例程来测试您的编码是否正常工作(也许是单元测试?)。您可能会发现测试与您遇到的问题一致失败。

于 2012-10-04T06:04:27.393 回答