2009-08-21 13 views
9

は、私は私が編集し、修正版として保存することができるように進値の配列にpic.bmpを変換するJavaJava:File to Hex?

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

にファイルを持っています。

これを行うJavaクラスはありますか?

+2

Vimで 'hexdump'、' hexedit'や単に ':%!xxd'のようなツールを使うのは簡単ではないでしょうか? –

答えて

19

あなたは運がいいです。私は数ヶ月前にこれをやらなければならなかった。コマンドラインから2つのパラメータを取るダムダウン版です。どちらのコマンド行パラメータもファイル名です...最初は入力ファイル、2番目は出力ファイルです。入力ファイルはバイナリで読み込まれ、出力ファイルはASCII 16進数で書き込まれます。うまくいけば、あなたはこれをあなたのニーズに適応させることができます。

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

ありがとうございます!これはまさに私が必要としていたものです。あなたはロック! – BinRoot

+1

@ニック:それはあなたが望んだことであるという質問からはっきりとは分かりませんでした。 –

+0

給料がコード行に依存する場合は、256個のif文を書くことができます:) –

3

Javaには、広範なイメージ読み取り/書き込みおよび編集ライブラリがあります。 javax.imageioパッケージをご覧ください(documentation)。 ImageIOを使用してBufferedImageを作成し、次にBufferedImageオブジェクトから画像データにアクセスすることをお勧めします(その方法があります)。

一般的な回答が必要な場合は、バイナリデータの種類(画像だけではない)に応じて、ファイルの内容をバイト配列に読み込む必要があります。このような何か:

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

私はそれがイメージか実行可能かzipアーカイブであるかどうか16進数に任意のファイルに変換できるようにします。したがって、ファイルをバイナリまたは16進数として読み取って値を変更し、新しい変更ファイルとして保存する一般的な方法はありませんか? – BinRoot

+2

in.read(bytes)はこれを行う最も一般的な方法です。数値を16進数で出力する場合は、System.out.printf( "%X"、bytes [0])を使用します。 –

0

あなたは、バイトを自分でいじるのFileInputStreamからのFileChannelを取得し、その後のByteBufferを割り当て、それにすべてのコンテンツを読みたい場合。 ByteBufferには、2つの異なるバイトオーダーで、より大きなバイトのチャンクを処理するメソッドもあります。

1

Google検索に「Javaの16進エンコーディング」と入力した場合、最初の結果は、あなたが「私は進値の配列にpic.bmpを変換する」の部分に答えるために使うべきものであるhttp://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/Hex.htmlですあなたの質問の

"私はそれを編集して修正版として保存できます"とはどのように役立ちますか。おそらくそれには16進エディタを使うべきです。例えば。 ghex2

+0

更新されたURL:http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Hex.html –