【问题标题】:Convert this line of Java code to C# code将这行 Java 代码转换为 C# 代码
【发布时间】:2013-07-12 05:14:15
【问题描述】:

我需要这行 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));
      }

【问题讨论】:

  • 它应该只是 0xFF,因为 AFAIK 它太小并且没有设置 MSB,所以不应该遇到任何对 unchecked 的需求。
  • 你是否至少能够遵循代码。您会看到 0xFF 是 arrayOfByte[i] 中任何内容的掩码。除非数组中的内容大于一个字节,否则我看不出使用它的原因。
  • 我更新了它......也许在整个代码 sn-p 的上下文中它会更有意义
  • 我打赌 0xFF 正在做一些隐式转换,因为 0xFF 可能被视为一个 int。我几乎可以肯定您可以将 0xFF 更改为 -1 并获得相同的结果。
  • @asafreedman - 从大局来看,你是对的。但是(0xFF & arrayOfByte[i])(-1 & arrayOfByte[i])不一样。

标签: c# java hex


【解决方案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 +的目的是保证toString的结果是3个十六进制数字。最后,前导数字被删除,留下一个用零填充的 2 位十六进制数字。

【讨论】:

  • 也给出了与此相同的答案。 String.format("%02x",arrayOfByte[i])
【解决方案2】:

请注意,您可以在 C# 中执行此操作的实际方法如下。

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

与Java非常相似

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

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

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2016-04-14
    • 2014-05-27
    • 2015-09-27
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多