Java: Файл в Hex? - PullRequest
       32

Java: Файл в Hex?

9 голосов
/ 22 августа 2009

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

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

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

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

Ответы [ 4 ]

19 голосов
/ 22 августа 2009

Вам повезло. Я должен был сделать это пару месяцев назад. Вот упрощенная версия, которая принимает два параметра из командной строки. Оба параметра строки команды являются именами файлов ... первый - это входной файл, а второй - выходной файл. Входной файл читается в двоичном формате, а выходной файл записывается в шестнадцатеричном формате 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();
        }
    }
}
3 голосов
/ 22 августа 2009

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

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

byte[] bytes = new byte[in.available()];
in.read(bytes);
1 голос
/ 22 августа 2009

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

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

0 голосов
/ 22 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...