[英]Why is http content different when sent from c# vs java?
我有一个XML文件,需要将其作为帖子发送到REST服务器。 当我从c#和java中读取完全相同的文件时,字节到达服务器时不匹配。 Java代码失败,并显示500 Internal Server Error,而C#代码正常运行。 服务器是c#。
c#中的文件如下所示:
using (ms = new MemoryStream())
{
string fullPath = @"c:\pathtofile\datalast.xml";
using (FileStream outStream = File.OpenRead(fullPath))
{
outStream.CopyTo(ms);
outStream.Flush();
}
ms.Position = 0;
var xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
content = xmlDoc.OuterXml;
}
然后将内容发送到使用HttpWebResponse的呼叫
Java(Android)代码读取文件的方式如下:
FileInputStream fis = app.openFileInput(DATA_LAST_FILE_NAME);
byte[] buffer = new byte[1024];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len;
while ((len = fis.read(buffer)) != -1)
{
outputStream.write(buffer, 0, len);
}
outputStream.close();
fis.close();
ByteArrayEntity data = new ByteArrayEntity(buffer);
data.setContentType("application/xml");
post.setEntity(data);
HttpResponse response = request.execute(post);
在大多数情况下,生成的数组是相同的。 唯一的区别似乎在于前3个字节。 C#字节数组的前三个值是:
239,187,191
Java的是:
-17,-69,-65
这是怎么回事 我该怎么办?
谢谢,
\\ ^ /生病
看看你在这里做什么:
FileInputStream fis = app.openFileInput(DATA_LAST_FILE_NAME);
byte[] buffer = new byte[1024];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len;
while ((len = fis.read(buffer)) != -1)
{
outputStream.write(buffer, 0, len);
}
outputStream.close();
fis.close();
ByteArrayEntity data = new ByteArrayEntity(buffer);
您正在从读取数据时使用的缓冲区中创建ByteArrayEntity
。 几乎可以肯定这不是正确的长度(长度始终为1024),而且也可能没有全部数据。
您应该使用已经写入的ByteArrayOutputStream
,例如
ByteArrayEntity data = new ByteArrayEntity(outputStream.toByteArray());
(顺便说一句,您应该在finally
块中关闭fis
。)
编辑:您已打印到控制台的值的确只是显示有符号和无符号表示之间的差异。 我认为,它们与Java代码失败的原因无关,这是由于上述问题所致。 您应该查看Wireshark中通过电线发送的内容-这将向您显示实际情况。
看一下这个: http : //en.wikipedia.org/wiki/Byte_order_mark
编辑:Java和C#之所以不同的原因是,在读取字节时,C#是无符号的,而Java是带符号的。 但是,相同的二进制值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.