Подтвердить что ты не робот

Преобразовать маленький файл Endian в большой Endian

как я могу преобразовать двоичный файл с именем Endit в большой двоичный файл Endian. У меня есть двоичный двоичный код, написанный на C, и я читаю этот файл на Java с DataInputStream, который читается в большом индийском формате. Также он посмотрел класс ByteBuffer, но понятия не имел, как использовать его для получения желаемого результата. пожалуйста, помогите.

спасибо alot

4b9b3361

Ответ 2

Открытие файла NIO FileChannel:

FileInputStream fs = new FileInputStream("myfile.bin");
FileChannel fc = fs.getChannel();

Установка ByteBuffer endianness (используется [get | put] Int(), [get | put] Long(), [get | put] Short(), [get | put] Double())

ByteBuffer buf = ByteBuffer.allocate(0x10000);
buf.order(ByteOrder.LITTLE_ENDIAN); // or ByteOrder.BIG_ENDIAN

Чтение из FileChannel в ByteBuffer

fc.read(buf);
buf.flip();
// here you take data from the buffer by either of getShort(), getInt(), getLong(), getDouble(), or get(byte[], offset, len)
buf.compact();

Чтобы правильно обрабатывать сущность ввода, вам нужно точно знать, что хранится в файле и в каком порядке (так называемый протокол или формат).

Ответ 3

Вы можете использовать EndianUtils из Apache Commons I/О:

Он имеет методы static, такие как long readSwappedLong(InputStream input), которые могут выполнять всю свопинг для вас. Он также имеет перегрузки, в которых используется byte[] как вход, а также write аналог (до OutputStream или byte[]). Он также имеет методы без ввода-вывода, такие как int swapInteger(int value) методы, которые могут преобразовывать простые примитивы Java.

В пакете также есть много полезных служебных классов, таких как FilenameUtils, IOUtils и т.д.

См. также

Ответ 4

Две функции ниже меняются между контентом 2 и 4 байта.

static short Swap_16(short x) {

    return (short) ((((short) (x) & 0x00ff) << 8) | (((short) (x) & 0xff00) >> 8));
}

static int Swap_32(int x) {
    return ((((int) (x) & 0x000000ff) << 24)
            | (((int) (x) & 0x0000ff00) << 8)
            | (((int) (x) & 0x00ff0000) >> 8) | (((int) (x) & 0xff000000) >> 24));
}

Ответ 5

Я думаю, вы должны прочитать каждые 4 байта и просто изменить их порядок.

Ответ 6

Недавно я написал сообщение в блоге о том, как это сделать. О том, как вы можете конвертировать двоичные файлы между контентом. Добавьте его сюда для дальнейшего использования для всех, кто придет сюда.

Это можно сделать из следующего простого кода

FileChannel fc = (FileChannel) Files.newByteChannel(Paths.get(filename), StandardOpenOption.READ);
ByteBuffer byteBuffer = ByteBuffer.allocate((int)fc.size());
byteBuffer.order(ByteOrder.BIG_ENDIAN);
fc.read(byteBuffer);
byteBuffer.flip();

Buffer buffer = byteBuffer.asShortBuffer();
short[] shortArray = new short[(int)fc.size()/2];
((ShortBuffer)buffer).get(shortArray);

byteBuffer.clear();
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
ShortBuffer shortOutputBuffer = byteBuffer.asShortBuffer();
shortOutputBuffer.put(shortArray);

FileChannel out = new FileOutputStream(outputfilename).getChannel();
out.write(byteBuffer);
out.close();

Для получения более подробной информации о том, как это работает, вы можете ссылаться на исходное сообщение в блоге - http://pulasthisupun.blogspot.com/2016/06/reading-and-writing-binary-files-in.html

Или код доступен по адресу https://github.com/pulasthi/binary-format-converter