2012-05-09 12 views
1

特定のStringをbyte []に​​変換しようとしています。特定の文字列をbyte []に​​変換する

ザ・文字列は次のようになります。 55 55 F5 FF FF

を、ここで私はそれのために書いた方法であり、誰かが間違っているか、よりよい解決策を持っているものを私に伝えることができると思います。

public static byte[] stringToByte(String text) { 
    //byte[] length ==> String (length+1)/3 
    byte raw[] = new byte[(text.length() + 1)/3]; 
    int j = 0; 
    for (int i = 0; i < text.length(); i += 2) { 
     String h = ""; 
     h += text.charAt(i); 
     h += text.charAt(i + 1); 
     i++; 
     raw[j] = Byte.valueOf(h); 
     j++; 
    } 
    return raw; 
} 

問題はF5になるまでは問題です。私はあなただけのスペース区切りの文字列をループしてバイトオブジェクトを解析しているように見えます

byte raw[] = {(byte) 0x55, (byte) 0x55, (byte) 0x5F,(byte) 0xFF,(byte) 0xFF}; 
+0

ごめんなさい。私が "raw = text.getBytes();"を使うと、私は14の位置で配列を取得しますが、私は私の質問で最後のコードブロックのように5と1つが必要です。 – Jay

+0

'Byte.valueOF'のドキュメントを見ると、' 'parseByte'を指し示します。"文字列中の文字はすべて、10進数字でなければなりません。ただし、最初の文字はASCIIマイナス記号かもしれません " 。だから、あなたが 'F'を与えると、それが爆発するのです。 –

+2

ああ、今私は見る - 私はこれが合うと思う:http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using -java – birryree

答えて

2

これは動作します:

public static byte[] stringToByte(String text) { 
    final String[] split = text.split("\\s+"); 
    final byte[] result = new byte[split.length]; 
    int i = 0; 
    for (String b : split) result[i++] = (byte)Integer.parseInt(b, 16); 
    return result; 
} 

なぜ? byteは符号付き数量であり、範囲外のものは直接byteに解析できません。しかし、intを解析してからbyteに変換すると、結果が得られます。

0

を使用しているかのよう

私はバイト[]に同じ値を必要とします。ケースでは、私のようなものを使用することをお勧めしたい:

  String text = ""; 
     String[] strArr = text.split(" "); 
     for (String str: strArr) 
     { 
      //convert string to byte here 
     } 
0
byte[] raw = new byte[text.length() >> 1]; 
for(int i=0; i<text.length();i+=2){ 
    raw[i >> 1] = Integer.parseInt(text.substring(i, i+2),16); 
} 

バイトが符号なしバイトではないので、私はInteger.parseInt()の代わりByte.parseByte()を使用。私はString text = "55555FFF";で試しました。

+0

あなたのコードは '型の不一致:intからbyteに変換できません 'を生成しますが、修正するのは簡単です。 –

+0

@MarkoTopolnik oops、GroovyConsoleを使ってテストしました – user845279

0

トークンごとにStringTokenizerを使用することもできます。

public static byte[] stringToByte(String text) { 
    StringTokenizer st = new StringTokenizer(text); 
    byte raw[] = new byte[st.countTokens()]; 
    for (int i = 0; i < raw.length; i++) { 
     raw[i] = (byte) Integer.parseInt(st.nextToken(), 16); 
    } 
    return raw; 
} 
+1

テストしましたか? java.lang.NumberFormatException:値が範囲外です。値: "F5"基数:16'しかし、修正するのは大したことではありません。 –

+0

私はそれを見ます。ありがとう! –

関連する問題