简单的写入和读取字节

Ale*_*euk 0 java

嘿,我无法弄清楚这里有什么问题.

写入文件:

byte[] dim = new byte[2];
dim[0] = (byte) deImgWidth; // Input 384
dim[1] = (byte) deImgHeight; // Input 216
out.write(dim);
Run Code Online (Sandbox Code Playgroud)

从文件中读取

byte[] file = new byte[(int) f.length()];
FileInputStream fs = new FileInputStream(f);
fs.read(file);
deImgWidth = ((file[0]) & 0xFF); // output 128
deImgHeight = ((file[1]) & 0xFF); // output 216
Run Code Online (Sandbox Code Playgroud)

为什么我可以检索相同的deImgHeight值而不是相同的deImgWidth值?

Mic*_*ski 6

在216处,384不适合无符号字节.这就是为什么在铸造前者时你必须丢失信息.

缩小转换只保留数字的最低位,因此如果& 0xFF在读取值时执行额外操作,则可以稍后恢复符号(因为Java对负数使用两个补码).216 = 0b11011000(适合8位)可以无损转换,但384 = 0b110000000(即9位) - 当你取低8位时,最终得到128.