2011-06-28 19 views
3
からバイト配列

可能性の重複:
Convert a string representation of a hex dump to a byte array using Java?のJava - 文字列

例えば、私は、文字列 "DEADBEEF" を持っています。どのようにバイト[]バイト= {0xDE、0xAD、0xBE、0xEF}に変換できますか?

+0

Googleはあなたの友だちです –

+2

[Javaを使用して16進ダンプの文字列表現をバイト配列に変換する](http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a)を参照してください。 -hex-dump-to-a-byte-array-using-java) – wjans

+3

なぜ人々はAPIを使用しないのですか? :[ – mre

答えて

6

ループと各ペアは個別に変換する:

byte[] bytes = new byte[str.length()/2]; 

for(int i = 0; i < str.length(); i+=2) 
    bytes[i/2] = ((byte)Character.digit(str.charAt(i),16))<<4)+(byte)Character.digit(str.charAt(i),16); 

私はこのコードをテストしていません(私は気圧私と一緒にコンパイラを持っていない)が、私は私が通じアイデアを得たいと考えています。減算/加算は、単に「A」を数字10に、「B」を11に変換します。ビットシフト< < 4は、最初の16進数を正しい場所に移動します。

EDIT:少し考え直した後、正しい質問をしているかどうかわかりません。あなたは "DE"を{0xDE}に、あるいはおそらく{0x44,0x45}に変換しますか?後者はもっと便利です、前者は宿題問題のようなものです。

+1

+1質問:誰かが質問をした! – Nick

+0

後者はなぜより有用でしょうか? 1番目は標準の16進数エンコーディングです。あなたの「より良い」解釈に合った問題を見つけるのは難しいです。 – musiKk

+0

@musiKk:後者は「16進デコード」ではなく「ASCIIエンコード」と呼ばれます。 –

3

getBytes()は、プラットフォームエンコーディングの文字のバイト数を取得します。しかし、実際に表現されているバイト配列に16進表現のバイトを含むStringを変換したいと思うようです。 Convert a string representation of a hex dump to a byte array using Java?(注:私は個人的に哲学的な理由のうちのコモンズ・コーデックが、よりを使用するために第二の答えを好む)私は、この既存の質問に向かってあなたを指すことになり場合

2つの文字の各ペアを通じて

2

あなたは長い間に文字列を解析して、バイトを抽出することができます。

String s = "DEADBEEF"; 
long n = Long.decode("0x" + s); //note the use of auto(un)boxing here, for Java 1.4 or below, use Long.decode("0x" + s).longValue(); 
byte[] b = new byte[4]; 
b[0] = (byte)(n >> 24); 
b[1] = (byte)(n >> 16); 
b[2] = (byte)(n >> 8); 
b[3] = (byte)n; 
+0

これはこの場合に機能しますが、一般的に16桁までの16進数(つまり8デコードされたバイト)の文字列に対してのみ有効です。 –

+0

@Pauloですが、必要に応じて文字列を16文字のバッチに分割できます。 – Thomas

1

tskuzzyの答えは正しいかもしれません(テストしていない)が、できれば、私は、ApacheからCommons Codecを使用してお勧めします。それはあなたが必要なものを行うHexクラスを持っています。