Java 如何删除前导“;f";使用toHexString解析长字符串时

Java 如何删除前导“;f";使用toHexString解析长字符串时,java,java-8,bit-manipulation,Java,Java 8,Bit Manipulation,我正在为我的项目编写单元测试,试图使用方法long.toHexString(l)以十六进制字符串格式检查long的值 当我使用long等于111进行测试时,我得到的值6f是正确的,正如我所期望的那样 但是当long是-64时,我期望c0但是相反,我得到ffffffffffffc0 通过阅读Java文档,我可以看到该方法需要一个无符号long,如果传递了一个负值,则返回2s补码。但如何纠正这一点呢 我写了一个小单元测试程序来演示 @Test public void long_to_hex() {

我正在为我的项目编写单元测试,试图使用方法
long.toHexString(l)
以十六进制字符串格式检查
long
的值

当我使用
long
等于
111
进行测试时,我得到的值
6f
是正确的,正如我所期望的那样

但是当long是
-64
时,我期望
c0
但是相反,我得到
ffffffffffffc0

通过阅读Java文档,我可以看到该方法需要一个无符号long,如果传递了一个负值,则返回2s补码。但如何纠正这一点呢

我写了一个小单元测试程序来演示

@Test
public void long_to_hex() {
   Long l = new Long(-64);
   //Long l = new Long(111);
   System.out.println(l.toHexString(l));
}

您的语句“如果传递了负值,则返回2s补码”不匹配:

无符号长值是参数加2⁶⁴ 如果论点是否定的;否则,它等于论点

因此,实际上情况正好相反,您传入的值已经在使用2s补码,但是返回的值是一个字符串,即使不被解释为2s补码,它也能够再现右
位。换句话说,在
long
值中,所有高位都已设置,因此,十六进制表示法具有相应的前导
f
字符数

另一种方法是保持代表性签名:

long l = -64;
System.out.println(Long.toHexString(l));
System.out.println(Long.toString(l, 16));
FFFFFFFFFFC0
-40

“但如何纠正这一点?”您为什么认为这是错误的?由于您已经阅读了文档,您应该理解为什么它返回它返回的内容,并且您想要的行为是非标准的。你能解释一下你期待
c0
背后的逻辑吗?
c0
不是192的十六进制吗?@Sweeper我想他的意思是退出领先的
f
s@snr是的,但是为什么?前导的
f
s是正确的。@DavidConrad毫不犹豫。
Long l=new Long(-64)->
长l=-64
l.toHexString(l)
->
Long.toHexString(l)
。感谢您的帖子。我弄糊涂了。我的用例如下。我有一个字节数组[],需要为测试检查其值。一个值是192(它是IP地址的一部分)。字节值为-64,但应表示为c0的十六进制值。我之所以使用前导f,是因为我将该值存储为有符号值,并且它应该是无符号值。字节-64作为无符号值(使用int)是192,而192作为十六进制是c0。也许我应该更新这个问题来澄清这一点?当您的数据实际上是
字节
时,使用
是一个奇怪的选择。当您使用
字节b1=-64;String str=Integer.toHexString(b1&0xff);字节b2=(字节)整数.parseInt(str,16)“c0”
b1==b2
。或者,
Integer.toHexString(Byte.toUnsignedInt(b1))
也会这样做。谢谢你,霍尔格,这太棒了-你真的理解了我的问题。我可以使用你建议的技术,Byte.toUnsignedInt(b1)——这对我来说很有用。