从C#中的base64和UTF8转换后获取视频文件 - c#

我需要做的是将文件从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,最后我不确定如何制作。我试图发送的是video.mp4大小为144kb或更小的文件。到目前为止,输出显示“ WRONG FORMAT”的捕获。看到代码。

    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 >>字符串)时,它起作用。

参考方案

该文件通过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是无损的,所以很好。 (可以承认的是,您可以通过使用无效字符串替换一个代理对的一半来破坏它,但是...)问题在于,您首先将非文本数据视为文本。

Ajax表单未获得结果 - javascript

我有一个带有搜索功能的主页。从主页搜索可以正常工作,但是当我尝试使用ajax表单(在url.com/search?id=biology上)再次搜索时,我被重定向到404页面,提示未找到/Search。主页上的表格:@using (Html.BeginForm("Index", "Search", new { Retur…

调整窗口大小时如何调整YouTube播放器的大小 - php

我想显示包含YouTube视频的弹出窗口。我的问题是当用户调整弹出窗口的大小时如何调整YouTube播放器的大小?弹出窗口的头部分PHP / HTML代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/…

PHP-复选框组 - php

我有一个需要发布的表单复选框组。<input type="checkbox" value="true" checked name="chk0[]"> <input type="checkbox" value="false" name=…

jQuery和Gridview更新面板不起作用 - c#

我必须按照某些给定条件实现gridview的闪烁:gridview row blinking based on some conditions我能够成功实现它,但是随后我被要求在5秒钟内自动刷新gridview,为此我使用了ajax更新面板和计时器,但随后出现如下新的JavaScript错误:码: <form id="form1" …

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…