2009-08-21 10 views
9

Mam plik w JavieJava: Plik do Hexa?

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

chcę przekonwertować pic.bmp do tablicy wartości hex, więc mogę edytować i zapisać go w wersji zmodyfikowanej.

Czy jest to klasa Java?

+2

Czy nie byłoby łatwiej użyć narzędzia takiego jak 'hexdump',' hexedit' lub po prostu ':%! xxd' w Vim? –

Odpowiedz

19

Masz szczęście. Musiałem to zrobić kilka miesięcy temu. Oto wersja zubożona, która pobiera dwa parametry z wiersza poleceń. Oba parametry linii komend to nazwy plików ... pierwszy to plik wejściowy, a drugi to plik wyjściowy. Plik wejściowy jest odczytywany jako plik binarny, a plik wyjściowy zapisywany jest jako szesnastkowy ASCII. Mam nadzieję, że po prostu dostosujesz to do swoich potrzeb.

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

Dziękujemy! Dokładnie tego potrzebowałem. Rządzisz! – BinRoot

+1

@Nick: to było dalekie od oczywistości, od pytania, że ​​to jest to, czego chciałeś ... –

+0

jeśli twoja pensja zależy od linii kodu, możesz napisać 256, jeśli wypowiada się :) –

3

Java posiada obszerną bibliotekę do odczytu/zapisu obrazu i edycji. Spójrz na pakiety javax.imageio (tutaj jest documentation). Prawdopodobnie chcesz utworzyć BufferedImage przy użyciu ImageIO, a następnie uzyskać dostęp do danych obrazu z obiektu BufferedImage (istnieją metody).

Jeśli chcesz uzyskać ogólną odpowiedź, dla dowolnego typu danych binarnych (nie tylko obrazów), to domyślam się, że musiałbyś odczytać zawartość pliku do tablicy bajtów. Coś takiego:

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

Chcę móc przekonwertować na hex dowolnego pliku, czy to obraz lub plik wykonywalny lub archiwum zip. Więc nie ma ogólnego sposobu na odczytanie pliku w postaci binarnej lub szesnastkowej, aby zmienić wartości i zapisać jako nowy zmodyfikowany plik? – BinRoot

+2

in.read (bytes) to najbardziej ogólny sposób robienia tego. Jeśli chcesz wyprowadzić liczbę na hex, użyj System.out.printf ("% X", bajty [0]); –

0

Jeśli chcesz bawić się z bajtów siebie, uzyskać FileChannel z FileInputStream, a następnie przydzielić ByteBuffer a następnie odczytać całą zawartość do niego. ByteBuffer ma również metody radzenia sobie z większymi porcjami bajtów w dwóch różnych zamówieniach bajtów.

1

Jeśli wpiszesz „kodowanie java szesnastkowym” w wyszukiwarce Google, pierwszy wynik jest http://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.html co jest, co należy użyć, aby odebrać „Chcę przekształcić pic.bmp do tablicy wartości hex” część twojego pytania.

Nie widzę sposobu, w jaki pomaga ci to, "mogę edytować i zapisać jako zmodyfikowaną wersję". Powinieneś prawdopodobnie użyć do tego edytora szesnastkowego. na przykład. ghex2

+0

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

Powiązane problemy