-1

我需要这行 Java 代码:

Integer.toString(256 + (0xFF & arrayOfByte[i]), 16).substring(1)

转换为 C#,因为我不确定如何使用“0xFF”。

编辑 这是完整的代码:

MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
      localMessageDigest.update(String.format(Locale.US, "%s:%s", new Object[] { paramString1, paramString2 }).getBytes());
      byte[] arrayOfByte = localMessageDigest.digest();
      StringBuffer localStringBuffer = new StringBuffer();
      for (int i = 0; ; i++)
      {
        if (i >= arrayOfByte.length)
          return localStringBuffer.toString();
        localStringBuffer.append(Integer.toString(256 + (0xFF & arrayOfByte[i]), 16).substring(1));
      }
4

2 回答 2

6

关于这一点,您可以在 C# 中执行此操作的实际方法如下。

String.Format("{0:x2}", arrayOfByte[i]);

这与Java非常相似

String.format("%02x", arrayOfByte[i]);

这是一种更简单的方法来做他们上面所做的事情。

于 2013-07-14T01:42:27.133 回答
1

该 Java 表达式正在将有符号字节转换为无符号字节,然后转换为零填充的十六进制。

您应该能够在 C# 中编写代码。


FWIW,Java代码给出了与此相同的答案:

  Integer.toString(256 + arrayOfByte[i], 16).substring(1)

或者

  String.format("%02x", arrayOfByte[i])

以下是原版的工作原理。子表达式

  (0xFF & arrayOfByte[i])

相当于

  (0xFF & ((int) arrayOfByte[i]))

它将有符号字节(-128 到 +127)转换为无符号字节(0 到 +255)。原始魔术的目的256 +是确保结果为toString3 个十六进制数字。最后,前导数字被删除,留下一个零填充的 2 位十六进制数字。

于 2013-07-14T01:29:19.213 回答