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?
In Java programs, hexadecimal numbers are written by placing 0x before numbers.
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.
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];
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();
}
}
}
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With