365連休

にわかのandroidとかの開発メモ。

【Self Stack Overflow】Javaで数値を16進数文字列へ変換する方法

自問

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

 

 

 

neet-rookie.hatenablog.com