Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: File to Hex?

Tags:

java

hex

I have a file in Java

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

I want to convert pic.bmp to an array of hex values so I can edit and save it as a modified version.

Is there a java class to do this?

like image 711
BinRoot Avatar asked Aug 21 '09 23:08

BinRoot


People also ask

Can you use hex in Java?

In Java programs, hexadecimal numbers are written by placing 0x before numbers.

Can we convert string to hex?

Initialize final Hex string as empty. Consider every character from input, cast it into integer. This integer value is ascii value of that character. Change this integer value into hexadecimal value and add this hexadecimal value to final Hex string.

How do you convert hex to bytes?

To convert hex string to byte array, you need to first get the length of the given string and include it while creating a new byte array. byte[] val = new byte[str. length() / 2];


2 Answers

You're in luck. I had to do this a couple months ago. Here's a dumbed-down version that takes two parameters from the command line. Both comand line parameters are filenames...the first is the input file and the second is the output file. The input file is read in binary and the output file is written as ASCII hex. Hopefully you can just adapt this to your needs.

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();
        }
    }
}
like image 176
Brent Writes Code Avatar answered Oct 06 '22 00:10

Brent Writes Code


Java has an extensive image reading/writing and editing library. Look at the javax.imageio packages (here's the documentation). You would probably want to create a BufferedImage using ImageIO and then access the image data from the BufferedImage object (there are methods for that).

If you want a generic answer, for any type of binary data (not just images), then I guess you would have to read the contents of the file into a byte array. Something like this:

byte[] bytes = new byte[in.available()];
in.read(bytes);
like image 24
David Z Avatar answered Oct 06 '22 00:10

David Z