2016-05-16 8 views
4

私は、Python 2.xの中で、私はちょうどバイナリリテラルデータをJavaでエンコードするコンパクトな方法はありますか?

b = '\x01\x02\x04\x08\x80\x40\x20\xff\xef\x40\x30\xfe\x3f\x90\x44\x78' 

を使用することができるのに対し、Java構文が苦痛であると(byte)は、最上位ビットが設定された値を処理するためにキャストする必要がありますJavaの

final byte[] b = new byte[]{0x01, 0x02, 0x04, 0x08, 
          (byte)0x80, 0x40, 0x20, (byte)0xff, 
          (byte)0xef, 0x40, 0x30, (byte)0xfe, 
          0x3f, (byte)0x90, 0x44, 0x78}; 

これを行うことができます。

もっと簡単な方法はありますか? ("01020408804020ffef4030fe3f904478"のような文字列をbyte[]に変換するヘルパークラスの作成以外)

+0

「BigInteger」を使用すると、ヘルパークラスを自分で書く必要がなくなります。 – resueman

+1

* "ヘルパークラスを書くのを除いて" ... *私はそうは思わない。 –

+1

@malbarbo - その質問の複製ではなく、キャストの欠如による問題の修正方法を知りたいだけです。私は、Javaでバイト配列リテラルを作成するデフォルトの方法ではキャストが必要だと知っています。バイト配列をよりコンパクトに表現する方法があるかどうかを知りたいのです。 –

答えて

3

あなたの毒を選んでください。すべての選択肢は、いずれかの方法で痛いです。
It is lamentable that Java's byte type is signed instead of unsigned

  1. キャスト付きの16進バイト定数です。一様性のためには、すべての要素をキャストする必要があります。これは非常に短いリストでは問題ありません。

    byte[] b = {(byte)0x00, (byte)0x7F, (byte)0x80, (byte)0xFF}; 
    
  2. キャストを避けるための符号付き10進バイト定数です。しかし、このフォーマットを簡単に読み書きできるツールはほとんどありません。おそらく実際には役に立たないでしょう。

    byte[] b = {0, 127, -128, -1}; 
    
  3. ヘルパ関数を使用したInt対byte変換。それはきちんとして見栄えが良く、中程度のデータに役立ちます。

    byte[] b = toBytes(new int[]{0x00, 0x7F, 0x80, 0xFF}); 
    
    static byte[] toBytes(int[] x) { 
        byte[] y = new byte[x.length]; 
        for (int i = 0; i < x.length; i++) 
         y[i] = (byte)x[i]; 
        return y; 
    } 
    
  4. 文字列からバイトへの変換。これで、1バイトあたり2文字(カンマなし、または0x)だけでなく、一定量のオーバーヘッドを使用できるようになりました。

    byte[] b = hexToBytes("007F80FF"); 
    
    static byte[] hexToBytes(String s) { 
        byte[] b = new byte[s.length()/2]; 
        for (int i = 0; i < b.length; i++) 
         b[i] = (byte)Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16); 
        return b; 
    } 
    
  5. Base64でエンコードされた文字列です。これは#4よりはるかにコンパクトですが、エンコードする作業が必要です。 java.util.Base64(Java SE 8以降)を使用すると簡単にデコードできます。私はstored a Base64 binary blob in my Java source codeの1つの実際の例を持っています。

関連する問題