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)——这对我来说很有用。