为什么从c#和java发送的http内容不同?
我有一个xml文件需要作为post发送到REST服务器。当我从c#和java读取完全相同的文件时,当它们到达服务器时,字节不匹配。java操作系统失败,出现500个内部服务器错误,而c#操作系统工作正常。服务器是c# c#中的文件如下所示:为什么从c#和java发送的http内容不同?,c#,java,xml,http,C#,Java,Xml,Http,我有一个xml文件需要作为post发送到REST服务器。当我从c#和java读取完全相同的文件时,当它们到达服务器时,字节不匹配。java操作系统失败,出现500个内部服务器错误,而c#操作系统工作正常。服务器是c# c#中的文件如下所示: using (ms = new MemoryStream()) { string fullPath = @"c:\pathtofile\datalast.xml"; using (FileStream outStream = File.Ope
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#字节数组的前3个值是:
239187191
java的是:
-17,-69,-65
这里发生了什么?我该怎么办
谢谢
\看看这个:
编辑:java和C#不同的原因是在读取字节时,C#是无符号的,java是有符号的。但是,相同的二进制值。看看这个:
编辑:java和C#不同的原因是在读取字节时,C#是无符号的,java是有符号的。但是,相同的二进制值。看看你在这里做什么:
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代码失败的原因无关,我相信这是由于上述问题造成的。您应该查看通过线路发送的内容-这将向您展示真正发生的事情。看看您在这里做的事情:
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代码失败的原因无关,我相信这是由于上述问题造成的。您应该查看通过线路发送的内容,这将向您显示实际情况。191未签名=-65已签名。可能是有符号/无符号字节问题?191无符号=-65有符号。可能是有符号/无符号字节问题?您的编辑是正确的,但我不相信BOM表与此相关。您的编辑是正确的,但我不相信BOM表与此相关。谢谢,我看到了我在这方面的错误。尽管代码以前的工作方式是这样的,尝试新的方式并没有改变结果。关闭以在azure box上安装Wireshark。@WWarrior:该代码以前可能正常工作,但除非您的文件长度恰好为1024字节,并且在一次调用中读取,否则您可能会丢失数据或发送太多数据(实际较少时为1024字节),或者很可能两者兼而有之。+1非常有用@Meta无法在默认情况下为您的所有答案实现自动的,比如+3(我在数值上非常灵活)。这将有助于其他SO的腕管;)谢谢你,我明白我的错误。尽管代码以前的工作方式是这样的,尝试新的方式并没有改变结果。关闭以在azure box上安装Wireshark。@WWarrior:该代码以前可能正常工作,但除非您的文件长度恰好为1024字节,并且在一次调用中读取,否则您可能会丢失数据或发送太多数据(实际较少时为1024字节),或者很可能两者兼而有之。+1非常有用@Meta无法在默认情况下为您的所有答案实现自动的,比如+3(我在数值上非常灵活)。这将有助于其他SO的腕管;)