Android整型转十六进制转换

21

我需要将一个整数转换为十六进制值。以下是一个示例整数值:

int_value = -13516;

要转换为十六进制值,我做如下操作:

hex_value = Integer.toHexString(int_value);

我应该得到的值是:-34CC(我不知道是否应该将其变成正数)。

问题在于,用这种方式进行转换后,我得到的值为:ffff cb34

我不能使用这个函数进行转换吗?


它确实进行了转换!它给出了该值的十六进制表示,因为它是负数,所以符号位被设置。Android使用二进制补码来表示负整数:负值由最左边的位设置,正值由最左边的位未设置。请参见有符号数的表示法。我意识到这已经两年了,但对底层机制的牢固掌握对程序员来说是极为宝贵的。 :) - Lorne Laliberte
@LorneLaliberte 如果您有C语言背景,那么printf的%X格式说明符将为您提供无符号十六进制表示形式,无论您输入的数字是有符号还是无符号,这仍然是意外的。更糟糕的是,Java甚至没有无符号整数类型,因此您甚至无法通过这种方式修复它! - Michael
@Micheal,在这种情况下,C语言和Java没有任何区别,事实上,Java也返回无符号值。无论哪种方式,位(以及位的十六进制表示)都是相同的。"有符号"和"无符号"只是对位的不同解释。我认为你可能需要回顾一下C语言中sprintf函数,因为%X格式化符在两种语言中的工作方式是相同的。 - Lorne Laliberte
6个回答

42

文档说明 Integer.toHexString 返回无符号 int 的十六进制表示形式。

我相信 Integer.toString(value, 16) 将能够实现您想要的功能。


目前我已经尝试过了,似乎是按照正确的方式完成了! - masmic

4
String.format("#%06X", (0xFFFFFF & colorYellow));

输出:#FFC107


3
public static int convert(int n) {
  return Integer.valueOf(String.valueOf(n), 16);
}
 // in onstart:
 Log.v("TAG", convert(20) + "");  // 32
 Log.v("TAG", convert(54) + "");  // 84

来自:Java整型转十六进制整型


但是这样做,你不是在进行从十六进制到整数的转换吗?我需要反过来,从有符号整数到十六进制。 - masmic

3

Integer.toHexStringString.format("%x")都不支持添加符号。为了解决这个问题,你可以使用三元表达式:

    int int_value = -13516;
    String hex_value = int_value < 0
                       ? "-" + Integer.toHexString(-int_value)
                       : Integer.toHexString(int_value);

2

请查看以下代码,了解整数到十六进制和十六进制到整数的转换:

public class MainActivity extends Activity {

int number;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    number = 678668;
    Log.i("ACT", "Integer Number  " + number);

    /**
     * Code for convert integer number to hex number. two mwthods.
     */
    Log.i("ACT", String.format("#%x", number)); // use lower case x for
                                                // lowercase hex
    Log.i("ACT", "#" + Integer.toHexString(number));

    /**
     * Code for convert hex number to integer number
     */
    String hex = Integer.toHexString(number).replace("/^#/", "");
    int intValue = Integer.parseInt(hex, 16);

    Log.i("ACT", "Integer Number  " + intValue);
   }

}

1

我认为以上的答案不能给出带符号位的精确值。例如,11的值是0B,但-11的值应该是F5而不是-B,因为2的补码被用来解决这个问题。我已经修改了以上的答案。

int int_value = -11;
 String hex_value = int_value < 0
                           ? Integer.toHexString(int_value+65536) :    Integer.toHexString(int_value);
 String shortHexString = hex_value.substring(2); 

在这里,65536指的是2的16次方,现在你可以得到预期的结果。祝编程愉快 :)

  • 列表项

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接