开发者

Why is http content different when sent from c# vs java?

开发者 https://www.devze.com 2023-04-12 14:05 出处:网络
I have an xml file that I need to send to a REST server as a post. When I read the exact same file from c# and java the bytes do not match when they arriv开发者_如何学Pythone at the server. The java o

I have an xml file that I need to send to a REST server as a post. When I read the exact same file from c# and java the bytes do not match when they arriv开发者_如何学Pythone at the server. The java ones fail with a 500 Internal Server Error while the c# one works perfectly. The server is c#.

The file in c# is read as follows:

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;

}

content is then sent to a call that uses an HttpWebResponse

The java (Android) code reads the file like this:

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);

For the most part the arrays generated are identical. The only difference seems to be in the first 3 bytes. The c# byte array's first 3 values are:

239,187,191

The java ones are:

-17,-69,-65

What is happening here? What should I do?

Thanks,

\ ^ / i l l


Look at what you're doing here:

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);

You're creating the ByteArrayEntity from the buffer that you've used when reading the data. It's almost certainly not the right length (it will always be length 1024), and it may well not have all the data either.

You should be using the ByteArrayOutputStream you've been writing into, e.g.

ByteArrayEntity data = new ByteArrayEntity(outputStream.toByteArray());

(You should be closing fis in a finally block, by the way.)

EDIT: The values you've printed to the console are indeed just showing the differences between signed and unsigned representations. They have nothing to do with the reason the Java code is failing, which is due to the above problem, I believe. You should look at what's being sent over the wire in Wireshark - that'll show you what's really going on.


Take a look at this: http://en.wikipedia.org/wiki/Byte_order_mark

EDIT: The reason why java and C# are different is that when reading the bytes, C# is unsigned, and java is signed. Same binary values, however.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号