Java 字节数组包含负数

2022-09-01 04:10:41

我正在将文件以块的形式读取到字节数组中,并通过POST请求通过网络将其发送到Web服务器。这并不复杂,在使用这个完全相同的代码之前,我已经做到了。这一次,我注意到我的图像到达服务器时看起来真的很奇怪,所以我决定查看正在发送的字节数组和正在接收的字节数组,以确保它是相同的。事实并非如此。在 java 发送端,字节数组包含负数。在 C# 接收端,没有负数。

接收端的前 15 个字节 (C#)

137
80
78
71
13
10
26
10
0
0
0
13
73
72
68

那些相同的字节,但在发送端(java)

-119
80
78
71
13
10
26
10
0
0
0
13
73
72
68

所有非负数都是相同的,-119不是唯一的负数,它们都结束了。我确实注意到-119和137相距256,并想知道这是否与它有关。

我用来读取图像的代码(java)

public static byte[] readPart(String fileName, long offset, int length) throws FileNotFoundException, Exception
{
    byte[] data = new byte[length];
    File file = new File(fileName);
    InputStream is = new FileInputStream(file);
    is.skip(offset);
    is.read(data,0,data.length);
    is.close();
    return data;
}

我用于写入数据的代码 (c#)

    private void writeFile(string fileName, Stream contents)
    {
        using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        {
            int bufferLen = 65000;
            byte[] buffer = new byte[bufferLen];
            int count = 0;
            while ((count = contents.Read(buffer, 0, bufferLen)) > 0)
            {
                fs.Write(buffer, 0, count);
            }
            fs.Close();
        }
        contents.Close();
    }

我不知道这是否是经常发生的事情,我只是以前从未注意到它,或者它是否决定犯可怕的错误。我所知道的是,这段代码以前适用于非常相似的东西,现在却不起作用。

如果有人有任何建议或解释,我将不胜感激。

编辑:我的图像看起来很奇怪的原因是我如何调用readPart方法。

byte[] data = FileUtilities.readPart(fileName,counter,maxFileSize);//counter is the current chunk number

我应该怎么称呼它

byte[] data = FileUtilities.readPart(fileName,counter*maxFileSize,maxFileSize);//the current chunk * cuhnksize for the offset...

谢谢大家,我现在不那么困惑了:)


答案 1

在Java中,是一个有符号值(使用二的补码来编码负值),所以如果大多数人意外,你所看到的是正确的。byte

要将 a 转换为无符号值,请使用byteintb & 0xff


答案 2

Java没有无符号字节;所有字节都被视为有符号。就这样。

真正重要的是你如何看待字节,因为你很少真正需要对字节进行比较。唯一显著的区别是,正如您所发现的那样,它们会打印出来作为签名。

如果您愿意,您可以使用例如Guava的UnsignBytes实用程序将Java字节视为无符号,但实际上没有太多的实际区别。