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