自問
Javaで数値を16進数文字列へ変換する方法を教えてください。
ベストアンサー
long型かint型の場合、Long.toHexString()またはInteger.toHexString()を使用する。
- "0x"+Long.toHexString(-1L) //"0xffffffffffffffff"
- "0x"+Integer.toHexString(-1) //"0xffffffff"
String.format("%x")でも全く同じ結果を得ることができる。
固定長で出力したい場合、
- long型の場合はString.format("0x%016x", 1L) //"0x0000000000000001"
- int型の場合はString.format("0x%08x", 1) //"0x00000001"
と指定すれば期待する結果を得ることができる。
Long.toString(radix=16)やInteger.toString(radix=16)を使用すると、負数の時に符号付き表現となり、通常期待する結果は得られない。
- "0x"+Long.toString(-1L, 16) //"0x-1"
- "0x"+Integer.toString(-1, 16) //"0x-1"
short型、byte型の場合、対応するShortとByteにはtoHexString()が存在しないが、
String.format()であれば、long型とint型同様に、期待した値を得ることができる。
もし、Integer.toHexString()で代用したい場合
- Integer.toHexString( 0xffff & shortValue) //(int)0x0000ffff & (short)0x???? -> (int)0x0000????
- Integer.toHexString( 0xff & byteValue) //(int)0x000000ff & (byte)0x?? -> (int)0x000000??
とすることで期待した値を得ることができる。
ビット論理積をとらないと、数値としてキャストされてしまうので注意。
- Integer.toHexString( (short)-1 ) //"ffffffff" = int -1
- Integer.toHexString( (byte)-1 ) //"ffffffff" = int -1
検証コード
public static void test(){ Log.d("long"); //Log.dはSystem.out.printlnと読み替えてね formatTest(0L); formatTest(-1L); formatTest(Long.MAX_VALUE); formatTest(Long.MIN_VALUE); formatTest(0xffffffffffffffffL); Log.d(""); Log.d("int"); formatTest(0); formatTest(-1); formatTest(Integer.MAX_VALUE); formatTest(Integer.MIN_VALUE); formatTest(0xffffffff); Log.d(""); Log.d("short"); formatTest((short)0); formatTest((short)-1); formatTest(Short.MAX_VALUE); formatTest(Short.MIN_VALUE); formatTest((short)0xffff); Log.d(""); Log.d("byte"); formatTest((byte)0); formatTest((byte)-1); formatTest(Byte.MAX_VALUE); formatTest(Byte.MIN_VALUE); formatTest((byte)0xff); } private static void formatTest(Number val){ Log.d(String.format("%s\t%d\t0x%s\t0x%x\t0x%016x\t0x%s", val.getClass().getSimpleName(), val, toHexString1(val), val, val, toHexString2(val))); } private static String toHexString1(@NonNull Number val){ if(val instanceof Byte){ return Integer.toString(val.byteValue() & 0xff, 16); }else if(val instanceof Short){ return Integer.toString(val.shortValue() & 0xffff, 16); }else if(val instanceof Integer){ return Integer.toString(val.intValue(), 16); }else if(val instanceof Long){ return Long.toString(val.longValue(), 16); }else if(val instanceof Float){ return "float ???"; }else if(val instanceof Double){ return "double ???"; } return "???"; } private static String toHexString2(@NonNull Number val){ if(val instanceof Byte){ return Integer.toHexString(val.byteValue() & 0xff); }else if(val instanceof Short){ return Integer.toHexString(val.shortValue() & 0xffff); }else if(val instanceof Integer){ return Integer.toHexString(val.intValue()); }else if(val instanceof Long){ return Long.toHexString(val.longValue()); }else if(val instanceof Float){ return Float.toHexString(val.floatValue()); }else if(val instanceof Double){ return Double.toHexString(val.doubleValue()); } return "???"; }
String.format("%d") | "0x"+Long.toString(radix=16) | String.format("0x%x") | String.format("0x%04x") | "0x"+Long.toHexString() | |
formatTest(0L); | 0 | 0x0 | 0x0 | 0x0000 | 0x0 |
formatTest(-1L); | -1 | 0x-1 | 0xffffffffffffffff | 0xffffffffffffffff | 0xffffffffffffffff |
formatTest(Long.MAX_VALUE); | 9223372036854775807 | 0x7fffffffffffffff | 0x7fffffffffffffff | 0x7fffffffffffffff | 0x7fffffffffffffff |
formatTest(Long.MIN_VALUE); | -9223372036854775808 | 0x-8000000000000000 | 0x8000000000000000 | 0x8000000000000000 | 0x8000000000000000 |
formatTest(0xffffffffffffffffL); | -1 | 0x-1 | 0xffffffffffffffff | 0xffffffffffffffff | 0xffffffffffffffff |
String.format("%d") | "0x"+Integer.toString(radix=16) | String.format("0x%x") | String.format("0x%04x") | "0x"+Integer.toHexString() | |
formatTest(0); | 0 | 0x0 | 0x0 | 0x0000 | 0x0 |
formatTest(-1); | -1 | 0x-1 | 0xffffffff | 0xffffffff | 0xffffffff |
formatTest(Integer.MAX_VALUE); | 2147483647 | 0x7fffffff | 0x7fffffff | 0x7fffffff | 0x7fffffff |
formatTest(Integer.MIN_VALUE); | -2147483648 | 0x-80000000 | 0x80000000 | 0x80000000 | 0x80000000 |
formatTest(0xffffffff); | -1 | 0x-1 | 0xffffffff | 0xffffffff | 0xffffffff |
String.format("%d") | "0x"+Integer.toString(radix=16) | String.format("0x%x") | String.format("0x%04x") | "0x"+Integer.toHexString( val & 0xFFFF ) | |
formatTest((short)0); | 0 | 0x0 | 0x0 | 0x0000 | 0x0 |
formatTest((short)-1); | -1 | 0xffff | 0xffff | 0xffff | 0xffff |
formatTest(Short.MAX_VALUE); | 32767 | 0x7fff | 0x7fff | 0x7fff | 0x7fff |
formatTest(Short.MIN_VALUE); | -32768 | 0x8000 | 0x8000 | 0x8000 | 0x8000 |
formatTest((short)0xffff); | -1 | 0xffff | 0xffff | 0xffff | 0xffff |
String.format("%d") | "0x"+Integer.toString(radix=16) | String.format("0x%x") | String.format("0x%04x") | "0x"+Integer.toHexString( val & 0xFF ) | |
formatTest((byte)0); | 0 | 0x0 | 0x0 | 0x0000 | 0x0 |
formatTest((byte)-1); | -1 | 0xff | 0xff | 0x00ff | 0xff |
formatTest(Byte.MAX_VALUE); | 127 | 0x7f | 0x7f | 0x007f | 0x7f |
formatTest(Byte.MIN_VALUE); | -128 | 0x80 | 0x80 | 0x0080 | 0x80 |
formatTest((byte)0xff); | -1 | 0xff | 0xff | 0x00ff | 0xff |