Java: Файл в Hex?

У меня есть файл на Java

FileInputStream in = null;
try{    
in = new FileInputStream("C:\\pic.bmp");
}catch{}

Я хочу конвертироватьpic.bmp к массиву шестнадцатеричных значений, чтобы я мог редактировать и сохранять его как измененную версию.

Есть ли класс Java для этого?

 Josef Pfleger22 авг. 2009 г., 09:28
Не было бы проще использовать такой инструмент, какhexdump, hexedit или просто:%!xxd в Vim?

Ответы на вопрос(4)

первый результат будетhttp://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.html это то, что вы должны использовать, чтобы ответить на часть вашего вопроса «Я хочу преобразовать pic.bmp в массив шестнадцатеричных значений».

Я не понимаю, как это поможет вам «поэтому я могу отредактировать и сохранить его как измененную версию». Возможно, вам следует использовать шестнадцатеричный редактор для этого. например. ghex2

 Jose Miguel Ordax25 нояб. 2013 г., 11:02

получите FileChannel из FileInputStream, а затем выделите ByteBuffer и затем прочитайте весь контент в него. ByteBuffer также имеет методы для работы с большими кусками байтов в двух разных порядках байтов.

Решение Вопроса

ная версия, которая принимает два параметра из командной строки. Оба параметра строки команды являются именами файлов ... первый - это входной файл, а второй - выходной файл. Входной файл читается в двоичном формате, а выходной файл записывается в шестнадцатеричном формате ASCII. Надеюсь, вы можете просто адаптировать это к вашим потребностям.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;

public class BinToHex
{
    private final static String[] hexSymbols = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public final static int BITS_PER_HEX_DIGIT = 4;

    public static String toHexFromByte(final byte b)
    {
        byte leftSymbol = (byte)((b >>> BITS_PER_HEX_DIGIT) & 0x0f);
        byte rightSymbol = (byte)(b & 0x0f);

        return (hexSymbols[leftSymbol] + hexSymbols[rightSymbol]);
    }

    public static String toHexFromBytes(final byte[] bytes)
    {
        if(bytes == null || bytes.length == 0)
        {
            return ("");
        }

        // there are 2 hex digits per byte
        StringBuilder hexBuffer = new StringBuilder(bytes.length * 2);

        // for each byte, convert it to hex and append it to the buffer
        for(int i = 0; i < bytes.length; i++)
        {
            hexBuffer.append(toHexFromByte(bytes[i]));
        }

        return (hexBuffer.toString());
    }

    public static void main(final String[] args) throws IOException
    {
        try
        {
            FileInputStream fis = new FileInputStream(new File(args[0]));
            BufferedWriter fos = new BufferedWriter(new FileWriter(new File(args[1])));

            byte[] bytes = new byte[800];
            int value = 0;
            do
            {
                value = fis.read(bytes);
                fos.write(toHexFromBytes(bytes));

            }while(value != -1);

            fos.flush();
            fos.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
 ykaganovich22 авг. 2009 г., 20:15
Если вы заботитесь о производительности, я думаю, что вы должны изменить toHexFromByte (байт b), чтобы добавить его в StringBuilder, а не возвращать новую 2-символьную строку.
 Brent Writes Code22 авг. 2009 г., 09:41
String.format () или printf в Java, конечно, красивее в коде, но по моему опыту они мучительно медленны по сравнению с манипулированием байтами и поиском в массиве напрямую. Это единственная причина, по которой я реализовал свой собственный метод toHexFromByte.
 BinRoot22 авг. 2009 г., 01:47
Спасибо! Это именно то, что мне было нужно. Ты жжешь!
 David Z22 авг. 2009 г., 06:24
@ Ник: это было далеко не очевидно из вопроса, что это то, что вы хотели ...
 Josef Pfleger22 авг. 2009 г., 09:28
Вы могли бы использоватьString.format("%x") вместо вашегоtoHexFromByte методы.

ображений. Посмотрите наjavax.ima,geio пакеты (вотдокументация). Возможно, вы захотите создатьBufferedImage с помощьюImageIO а затем получить доступ к данным изображения изBufferedImage объект (для этого есть методы).

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

byte[] bytes = new byte[in.available()];
in.read(bytes);
 Denis Tulskiy22 авг. 2009 г., 01:32
in.read (bytes) - самый общий способ сделать это. Если вы хотите вывести число в шестнадцатеричном формате, используйте System.out.printf ("% X", bytes [0]);
 BinRoot22 авг. 2009 г., 01:16
Я хочу иметь возможность конвертировать в hex любой файл, будь то изображение, исполняемый файл или ZIP-архив. Так не существует ли общего способа прочитать файл в двоичном или шестнадцатеричном виде, чтобы изменить значения и сохранить как новый измененный файл?

Ваш ответ на вопрос