ロギングの目的で、ログをバイト配列に変換してから 16 進文字列に変換しています。Java String に戻したいのですが、それができません。
ログ ファイルの 16 進文字列は次のようになります。
fd00000aa8660b5b010006acdc0100000101000100010000
どうすればこれをデコードできますか?
Hex
Apache Commons での使用:
String hexString = "fd00000aa8660b5b010006acdc0100000101000100010000";
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
System.out.println(new String(bytes, "UTF-8"));
byte[] bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(hexString);
String result= new String(bytes, encoding);
からString (hex)
まで行くことができます。16 進文字列の先頭にスペースなどがないことを確認してください。byte array
String as UTF-8(?)
public static byte[] hexStringToByteArray(String hex) {
int l = hex.length();
byte[] data = new byte[l / 2];
for (int i = 0; i < l; i += 2) {
data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i + 1), 16));
}
return data;
}
使用法:
String b = "0xfd00000aa8660b5b010006acdc0100000101000100010000";
byte[] bytes = hexStringToByteArray(b);
String st = new String(bytes, StandardCharsets.UTF_8);
System.out.println(st);
まずデータを読み込み、次にそれをバイト配列に変換します。
byte b = Byte.parseByte(str, 16);
次に、String
コンストラクターを使用します。
new String(byte[] bytes)
または、文字セットがシステムデフォルトでない場合は、次のようになります。
new String(byte[] bytes, String charsetName)
次のコードを試してください。
public static byte[] decode(String hex){
String[] list=hex.split("(?<=\\G.{2})");
ByteBuffer buffer= ByteBuffer.allocate(list.length);
System.out.println(list.length);
for(String str: list)
buffer.put(Byte.parseByte(str,16));
return buffer.array();
}
String に変換するには、decode メソッドによって返された byte[] を使用して新しい String を作成するだけです。
16 進文字列を Java 文字列に変換するもう 1 つの方法:
public static String unHex(String arg) {
String str = "";
for(int i=0;i<arg.length();i+=2)
{
String s = arg.substring(i, (i + 2));
int decimal = Integer.parseInt(s, 16);
str = str + (char) decimal;
}
return str;
}