2013-07-16 2 views
0

Ok поэтому у меня есть файл, который содержит ровно 8 байт:Чтение сырых байт из файла Java (обратный порядок байт выпуск)

hexdump /tmp/temp_session_TGAyUSfICJgY.txt 
0000000 b21b 113c bf3a 4a92      
0000008 

Когда я кот файл я вижу gobbly Гук, который является нормальным и ожидаемым (возможно, увидеть реальные символы в зависимости от вашего кодирования)

cat /tmp/temp_session_TGAyUSfICJgY.txt 
�<:��J 

Теперь в Java, когда я пытаюсь прочитать байты, они выходят назад. Мой код выглядит следующим образом:

  InputStream input = new FileInputStream(session_file_param); 
      int a = 0; 
      int i=0; 
      while(a != -1) { 
        a = input.read(); 
        System.out.println(a); 
        if(a != -1) { 
          pw[i] = (byte)a; 
        } 
        i++; 
      } 

      System.out.println("String representation of session pw is " + pw.toString()); 

Мой выход (добавлен = HEX для удобства чтения):

27 = 1b 
178 = b2 
60 = 3c 
17 = 11 
58 = 3a 
191 = bf 
146 =92 
74 = 4a 
-1 
String representation of pw is [[email protected] 

Если я читаю файл RAW, побайтно, не байты приходят в порядке? В основном каждый два байтовых блока переворачиваются.

EDIT:

Вы правы, извините за тревоги. Я сделал следующее испытание:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
     FILE *fp = fopen("/tmp/temp_session_TGAyUSfICJgY.txt", "r"); 
     char byte; 
     while (!feof(fp)) { 
       fread(&byte,1,1, fp); 
       printf("%x\n", byte); 
     } 
} 

и выход:

1b 
ffffffb2 
3c 
11 
3a 
ffffffbf 
ffffff92 
4a 
+0

Я считаю, что ваша проблема на самом деле шестнадцатеричного (хотя и не может быть уверен, не зная, какая версия/платформу, которую вы используете). Дисплей по умолчанию, как правило, 16 бит (два байта), объединенный, что будет иметь смысл, учитывая результат, который вы видите. Попробуйте запустить hexdump в однобайтовом режиме (например, с -b), и я ожидаю, что вы увидите выходные байты в ожидаемом порядке (или, по крайней мере, в том порядке, в котором их читает Java). – user1676075

ответ

1

Похоже, что hexdump со значениями по умолчанию выводит ваш файл в двух байтовых кусках, переворачивая их.

Попробуйте использовать

hexdump -C /tmp/temp_session_TGAyUSfICJgY.txt 

или

xxd /tmp/temp_session_TGAyUSfICJgY.txt 

видеть байты отображаются в порядке их появления в файле.

0

Используйте этот вариант шестнадцатеричного:

hexdump -C /tmp/temp_session_TGAyUSfICJgY.txt 

Вы увидите байты в том же порядке, что ваша программа Java производит.

думаю, по умолчанию hexdump делает big-endian шорты.

0

Вам действительно нужно знать, что было написано в файле (и как), чтобы определить, правильно ли вы читаете его. Вы можете управлять ByteOrder, как только вы знаете, как файл был написан. См. Этот вопрос. Export ByteBuffer as Little Endian File in Java

0

можно использовать:

INT чтения (байт [] б) считывает некоторое количество байтов из входного потока и сохраняет их в буфер массива б.

вместо Int чтения()

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