Java:文件到十六进制?

Java:文件到十六进制?,java,hex,Java,Hex,我有一个Java文件 FileInputStream in = null; try{ in = new FileInputStream("C:\\pic.bmp"); }catch{} 我想将pic.bmp转换为十六进制值数组,以便编辑并将其保存为修改版本 是否有java类来执行此操作?java有一个广泛的图像读/写和编辑库。查看javax.imageio包(以下是示例)。您可能希望使用ImageIO创建BufferedImage,然后从BufferedImage对象访问图像数据(有相

我有一个Java文件

FileInputStream in = null;
try{    
in = new FileInputStream("C:\\pic.bmp");
}catch{}
我想将pic.bmp转换为十六进制值数组,以便编辑并将其保存为修改版本


是否有java类来执行此操作?

java有一个广泛的图像读/写和编辑库。查看
javax.imageio
包(以下是示例)。您可能希望使用
ImageIO
创建
BufferedImage
,然后从
BufferedImage
对象访问图像数据(有相应的方法)

如果您想要一个通用的答案,对于任何类型的二进制数据(不仅仅是图像),那么我猜您必须将文件的内容读入字节数组。大概是这样的:

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

如果您想自己处理字节,请从FileInputStream获取一个FileChannel,然后分配一个ByteBuffer,然后将所有内容读入其中。ByteBuffer还提供了处理较大字节块的方法,采用两种不同的字节顺序。

你很幸运。几个月前我不得不这么做。下面是一个简化版本,它从命令行获取两个参数。Com和line参数都是文件名…第一个是输入文件,第二个是输出文件。输入文件以二进制读取,输出文件以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();
        }
    }
}
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileWriter;
导入java.io.IOException;
公共类BinToHex
{
私有最终静态字符串[]hexSymbols={“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“a”、“b”、“c”、“d”、“e”、“f”};
公共最终静态整数位每十六进制数字=4;
公共静态字符串toHexFromByte(最终字节b)
{
字节leftSymbol=(字节)((b>>每十六进制数字的位数)和0x0f);
字节rightSymbol=(字节)(b&0x0f);
返回(hexSymbols[leftSymbol]+hexSymbols[rightSymbol]);
}
公共静态字符串toHexFromBytes(最终字节[]字节)
{
if(bytes==null | | bytes.length==0)
{
返回(“”);
}
//每个字节有2个十六进制数字
StringBuilder hexBuffer=新的StringBuilder(bytes.length*2);
//对于每个字节,将其转换为十六进制并附加到缓冲区
for(int i=0;i
如果在谷歌搜索中键入“java十六进制编码”,第一个结果就是回答问题中的“我想将pic.bmp转换为十六进制值数组”部分


不过,我不知道它如何帮助你“这样我就可以编辑并将其保存为修改后的版本”。您可能应该为此使用十六进制编辑器。我希望能够将任何文件转换为十六进制格式,无论是图像、可执行文件还是zip存档文件。那么,是否有一种通用的方法可以将文件读取为二进制或十六进制来更改值并另存为新的修改文件呢?in.read(bytes)是最通用的方法。若要以十六进制输出数字,请使用System.out.printf(“%X”,字节[0]);非常感谢。这正是我需要的。你太棒了!如果您的工资取决于代码行,您可以编写256条if语句:)您可以使用
String.format(“%x”)
而不是
toHexFromByte
方法。String.format()或Java的printf在代码方面无疑更漂亮,但根据我的经验,与直接执行字节操作和数组查找相比,它们的速度非常慢。这是我实现自己的toHexFromByte方法的唯一原因。如果您关心性能,我认为您应该修改toHexFromByte(字节b)以附加到StringBuilder,而不是返回一个新的2字符字符串。使用像
hexdump
hexedit
或简单地
:%这样的工具不是更容易吗!Vim中的xxd
更新的URL: