【问题标题】:Append two hexadecimal long values in Java or C在 Java 或 C 中附加两个十六进制长值
【发布时间】:2012-05-22 03:18:36
【问题描述】:

我正在用 Java 实现 SHA-2 算法。但是,我遇到了一个问题。我需要将两个十六进制值附加到一个中,但我无法这样做。我尝试将两者附加为字符串并使用Long.parseLong(appendedString),但这会导致数字格式异常。无论如何我可以在Java中做到这一点吗?如果没有的话,无论如何都可以在 C 中执行此操作,我将在 C 中实现它?感谢阅读。

代码如下:

    String temp = h[0] + "" + h[1]; //Where h[0] and h[1] are two hex values stored as Long
    //I also tried String temp = String.valueOf(h[0]) + String.valueOf(h[1]); but no dice
    Long appended = Long.parseLong(temp); //Number format exception here

当我说附加时,我的意思是:0x6a09e667 + 0xbb67ae85 = 0x6a09e667bb67ae85

【问题讨论】:

  • 如果您的字符串类似于0xDEA0xDBEEF,这将解释数字格式异常。
  • “追加”是什么意思?
  • 如,0x6a09e667 + 0xbb67ae85 = 0x6a09e667bb67ae85
  • 请写出h[0]和h[1]的字符串值。
  • 现在这很有趣。字符串结果是 1779033703-1150833019 是 Java 不能提供文字表示吗?

标签: java c hex append


【解决方案1】:

0x6a09e667 + 0xbb67ae85 给出无效的0x6a09e6670xbb67ae85。试试这个代码:

String temp = h[0] + h[1].substring( 2 ); // Strip "0x" from second string

【讨论】:

  • 我得到错误 substring(int) cannot be invoked on the original type long
  • 我的代码仅在 h 是包含十六进制值的字符串数组时才有效(正如您在问题中所写的那样)。提问时请更加小心:始终使用数据类型包含的值(而不是您想象的数据类型中应该包含的值)。也就是说,理查德的回答是正确的。
【解决方案2】:

我假设您的代码如下所示:

long hex1 = 0x6a09e667;
long hex2 = 0xbb67ae85;

你想要0x6a09e667bb67ae85的输出。

您可以通过一些位移来做到这一点,例如:

long result = hex2 | (hex1 << 32);

【讨论】:

  • 当我使用它时得到这个:-4942790177982912921 这是因为 System.out.println() 的工作原理吗?
  • @D347th 是的。您需要让 println 打印结果的十六进制值,这可能可以通过一些谷歌搜索来完成 :)
  • @D347th 不可能。 Long 值最多只能存储 64 位,相反,您需要 BigInt,IIRC 可用于 java。因此,请改用它支持的位移功能。是的,你需要增加班次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2011-09-12
  • 2013-08-09
  • 2019-07-07
  • 1970-01-01
相关资源
最近更新 更多