3

同じ値を保持する Java の 16 進文字列を変換する方法。

Cには次のものがあります:

char tab[24] = { 0x02, 0x04, 0xF3, 0xFC, 0xFF, 0x06, 0x00, 0xF7, 0x00, 0x00, 0x09, 0xFD, 0xFD, 0x00, 0x03, 0x0A, 0xFD, 0x02, 0xFD, 0x08, 0x08, 0x00, 0x01, 0xFD };

そして、文字列のように Java にコピーします。

String hexString = "0x02, 0x04, 0xF3, 0xFC, 0xFF, 0x06, 0x00, 0xF7, 0x00, 0x00, 0x09, 0xFD, 0xFD, 0x00, 0x03, 0x0A, 0xFD, 0x02, 0xFD, 0x08, 0x08, 0x00, 0x01, 0xFD";

今、バイト[]で変換したいのですが、それを行う方法をいくつか見つけましたが、正しい形式で変換していないようです。

解決した

String[] split = hexString.split(", ");       
byte[] arr = new byte[split.length];
for (int i = 0; i < split.length; i++)
{
    arr[i] = (byte)(short)Short.decode(split[i]);
}
4

3 に答える 3

2

C にあるものは、Java では次のようになります。

byte[] tab = { 0x02, 0x04, (byte) 0xF3, (byte) 0xFC, (byte) 0xFF, 0x06, 
               0x00, (byte) 0xF7, 0x00, 0x00, 0x09, (byte) 0xFD, (byte) 0xFD, 
               0x00, 0x03, 0x0A, (byte) 0xFD, 0x02, (byte) 0xFD, 0x08, 
               0x08, 0x00, 0x01, (byte) 0xFD };

代わりにcharを使用し、 0xFD などbyteの許容範囲外の値には明示的なキャストが必要であることに注意してください。byteまた、宣言に配列の長さを含めません。


更新:キャストを手動で追加しないようにするには、より広いタイプ (int や short など) のデータを宣言してから、それをループします。

int[] temp = { ... };
byte[] tab = new byte[temp.length];
for (int i = 0; i<temp.length; i++) tab[i]=(byte)temp[i];

ただし、より良い解決策は、外部ファイルからデータをロードすることです。大きな配列リテラルは、C コンパイラが大きな配列リテラルをエンコードするように、コンパクトな方法でクラス ファイルにエンコードされません。

于 2013-08-16T16:09:56.990 に答える