我在Java的一个单元测试中遇到了一个大问题。我将字节数组与InputStream进行比较,但没有得到相同的结果。
示例如下:
public final class ByteGetInputStreamExampleProblem
{
public static void main( final String[] args ) throws Exception
{
final SecureRandom s = new SecureRandom() ;
final ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
long bPut = 0 ;
final byte[] buffer = new byte[ 2 ] ;
while( bPut < 10 )
{
s.nextBytes( buffer ) ;
bos.write( buffer ) ;
bPut += buffer.length ;
}
final InputStream is = new ByteArrayInputStream( bos.toByteArray() ) ;
System.out.print("A = ");
for( int i = 0 ; i < bos.size() ; i++ )
System.out.print( bos.toByteArray()[i] + ";" ) ;
System.out.print("nB = ");
int c ;
while( ( c = is.read() ) != -1 )
System.out.print(c + ":");
} ;
} ;
输出:
A = -3;-47;-121;37;-73;83;109;-54;
B = 253:209:135:37:183:83:109:202:20:106:
当您打印A的内容时,您将它们以字节形式打印。因此,它将打印从Byte.MIN_VALUE
到Byte.MAX_VALUE
(-128
到127
)之间的值。
当您使用is.read()
时,您读取的内容是作为int
传递给您的无符号数。该值介于0
和255
之间。
您可以通过将c
转换为字节来获得相同的输出,例如
while( ( c = is.read() ) != -1 ){
byte b = (byte)c;
System.out.print(b + ":");
}
本质上,您需要将两个数字转换为0
和255
之间或-128
和127
之间。
您可以通过将0
到255
的范围转换为-128
到127
的范围,将其转换为一个字节。
您可以通过执行value & 0xFF
将-128
转换为127
。这将使其在0
- 255
范围内。
ByteArrayInputStream
中read()
的代码如下:
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}