从Java FileInputStream读取字节时,如何区分-1和0xff?

Ron*_*own 2 java fileinputstream eof twos-complement

因此,我不得不参加面试,我需要编写一个执行简单XOR加密的迷你应用程序,并遇到了这个问题.我使用FileInputReader来拉入每个字节,使用密钥执行XOR操作,并将结果推回FileOutputStream.什么让我思考.

FileInputStream返回一个32位有符号类型的int.只接收一个字节时,可以将其转换为"字节"类型.如果FileInputStream达到EOF,它也返回-1.但是,在二进制补码二进制中-1 == 0xff,那么如果读取的字节真的是0xff而不是EOF怎么办?

除了特殊情况(例如EOF)之外,0xff是一个数学上不会返回的字节吗?或者这是您可能需要考虑的情况,具体取决于您正在阅读的数据?

Jes*_*per 13

不,-1在一个int不是0xff,但是0xffffffff.intJava是一个32位.

在将值转换为之前byte,检查它是否为-1.

read类的方法的API文档FileInputStream解释了这一点:

从此输入流中读取下一个数据字节.值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1.此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常.

因此,如果0xff在输入中找到具有该值的字节,则该read方法将返回int值为255(0xff)的值.仅在EOF上它将返回-1(0xffffffff存储在a中时int).