2016-06-29 4 views
3

Английский:Почему ByteArrayOutputStream и ByteArrayInputStream не совпадают с содержимым?

У меня есть большая проблема, во время одного из моих модульных тестов в Java. Я сравниваю массив байтов с InputStream, и я не получаю тот же результат.

Пример приведен ниже.

Благодарим за помощь, которую вы можете мне дать! :)


Français:

Bonjour Tout Le Monde!

J'ai un gros problème lors d'un de mes tests unitaires en java. Je dois comparer un tableau d'octet avec un objet InputStream et je n'obtiens pas le même résultat.

L'exampleple est plus bas.

Merci pour l'aide que vous pourrez m'apporter! :)


Пример:

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 + ":"); 
    } ; 
} ; 

Выход/Sortie:

А = -3; -47; -121; 37; -73; 83 ; 109; -54; 20; 106;

В = 253: 209: 135: 37: 183: 83: 109: 202: 20: 106:

ответ

3

При печати содержимого печатаемых их в виде байтов. Поэтому он будет печатать значения от 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 путем приведения его в байт.

Вы можете преобразовать -128 в 127, выполнив value & 0xFF. Это изменяет его на диапазон 0 - 255.

Код для read() в ByteArrayInputStream выглядит следующим образом:

public synchronized int read() { 
    return (pos < count) ? (buf[pos++] & 0xff) : -1; 
} 
+0

Это верно. И прочитайте, что такое ** «Дополнение» **. – RafToTheK

+0

Это работа :) Большое спасибо! Хорошего дня ! – SkayParadigm

 Смежные вопросы

  • Нет связанных вопросов^_^