2009-08-21 12 views
9

Tengo un archivo en JavaJava: ¿Archivo a maleficio?

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

Quiero convertir pic.bmp a una matriz de valores hexadecimales para que pueda editar y guardar como una versión modificada.

¿Hay una clase de Java para hacer esto?

+2

¿No sería más fácil usar una herramienta como 'hexdump',' hexedit' o simplemente ':%! xxd' en Vim? –

Respuesta

19

Estás de suerte. Tuve que hacer esto hace un par de meses. Aquí hay una versión simplificada que toma dos parámetros de la línea de comando. Ambos parámetros de comando y línea son nombres de archivo ... el primero es el archivo de entrada y el segundo es el archivo de salida. El archivo de entrada se lee en binario y el archivo de salida se escribe como hexadecimal ASCII. Con suerte, puedes adaptar esto a tus necesidades.

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

¡Gracias! Esto es exactamente lo que necesitaba. ¡Rock! – BinRoot

+1

@Nick: estaba lejos de ser obvio de la pregunta de que esto es lo que quería ... –

+0

si su salario depende de las líneas de código, puede escribir 256 si las declaraciones :) –

3

Java tiene una extensa biblioteca de lectura/escritura y edición de imágenes. Mire los paquetes javax.imageio (aquí está el documentation). Probablemente desee crear un BufferedImage usando ImageIO y luego acceder a los datos de imagen del objeto BufferedImage (hay métodos para eso).

Si desea una respuesta genérica, para cualquier tipo de datos binarios (no solo imágenes), entonces supongo que tendrá que leer el contenido del archivo en una matriz de bytes. Algo como esto:

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

Quiero convertir a hexadecimal cualquier archivo ya sea una imagen o un archivo ejecutable o zip. Entonces, ¿no hay una forma general de leer el archivo como un archivo binario o hexadecimal para cambiar los valores y guardarlo como un nuevo archivo modificado? – BinRoot

+2

in.read (bytes) es la forma más general de hacerlo. Si quiere sacar el número en hexadecimal, use System.out.printf ("% X", bytes [0]); –

0

Si desea jugar con los bytes a sí mismo, conseguir un FileChannel del FileInputStream, y luego asignar un ByteBuffer y luego leer todo el contenido en ella. ByteBuffer también tiene métodos para tratar con trozos más grandes de bytes, en los dos órdenes de bytes diferentes.

1

Si escribe "java codificación hexadecimal" en una búsqueda en Google, el primer resultado es http://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.html que es lo que debe utilizar para responder a la "Quiero convertir pic.bmp a una serie de valores hex" parte de tu pregunta.

No veo cómo te ayuda con "para poder editarlo y guardarlo como una versión modificada". Probablemente deberías usar un editor hexadecimal para eso. p.ej. ghex2

+0

URL actualizada: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Hex.html –

Cuestiones relacionadas