10 Stimmen

Java: Datei zu Hex?

Ich habe eine Datei in Java

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

Ich möchte konvertieren bild.bmp in ein Array von Hex-Werten umwandeln, damit ich es bearbeiten und als geänderte Version speichern kann.

Gibt es eine Java-Klasse, die dies ermöglicht?

2 Stimmen

Wäre es nicht einfacher, ein Tool wie hexdump , hexedit oder einfach :%!xxd in Vim?

20voto

Brent Writes Code Punkte 17926

Sie haben Glück. Ich musste das vor ein paar Monaten tun. Hier ist eine abgespeckte Version, die zwei Parameter aus der Befehlszeile benötigt. Beide Kommandozeilenparameter sind Dateinamen... der erste ist die Eingabedatei und der zweite die Ausgabedatei. Die Eingabedatei wird im Binärformat gelesen und die Ausgabedatei wird als ASCII-Hex geschrieben. Hoffentlich können Sie dies an Ihre Bedürfnisse anpassen.

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();
        }
    }
}

0 Stimmen

Ich danke Ihnen! Das ist genau das, was ich brauchte. Sie rocken!

0 Stimmen

Wenn Ihr Gehalt von Codezeilen abhängt, können Sie 256 if-Anweisungen schreiben :)

2 Stimmen

Sie könnten verwenden String.format("%x") anstelle Ihrer toHexFromByte Methoden.

3voto

David Z Punkte 121773

Java verfügt über eine umfangreiche Bibliothek zum Lesen/Schreiben und Bearbeiten von Bildern. Sehen Sie sich die javax.imageio Pakete (hier ist die Dokumentation ). Sie möchten wahrscheinlich eine BufferedImage 使って ImageIO und greifen dann auf die Bilddaten aus dem BufferedImage Objekt (dafür gibt es Methoden).

Wenn Sie eine allgemeine Antwort wollen, für jede Art von binären Daten (nicht nur Bilder), dann denke ich, Sie müssten den Inhalt der Datei in ein Byte-Array lesen. Etwas wie dies:

byte[] bytes = new byte[in.available()];
in.read(bytes);

0 Stimmen

Ich möchte in der Lage sein, jede Datei in Hex zu konvertieren, egal ob es sich um ein Bild, eine ausführbare Datei oder ein Zip-Archiv handelt. Gibt es nicht eine allgemeine Möglichkeit, die Datei als Binär- oder Hexadezimalwert zu lesen, die Werte zu ändern und als neue geänderte Datei zu speichern?

2 Stimmen

In.read(bytes) ist die allgemeinste Art, dies zu tun. Wenn Sie die Zahl in Hexadezimalzahlen ausgeben wollen, verwenden Sie System.out.printf("%X", bytes[0]);

1voto

Lispnik Punkte 709

Wenn Sie "java hexidecimal encoding" in eine Google-Suche eingeben, ist das erste Ergebnis http://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.html die Sie verwenden sollten, um den Teil "Ich möchte pic.bmp in ein Array von Hex-Werten konvertieren" Ihrer Frage zu beantworten.

Ich sehe allerdings nicht, wie es Ihnen hilft, "damit ich es bearbeiten und als geänderte Version speichern kann". Sie sollten wahrscheinlich einen Hexidecimal-Editor dafür verwenden. z.B. ghex2

0 Stimmen

0voto

Ken Punkte 804

Wenn Sie selbst mit den Bytes hantieren wollen, holen Sie sich einen FileChannel aus dem FileInputStream, weisen Sie einen ByteBuffer zu und lesen Sie dann den gesamten Inhalt in diesen. ByteBuffer hat auch Methoden, um mit größeren Byte-Blöcken in den zwei verschiedenen Byte-Reihenfolgen umzugehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X