我需要这行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));
}
答案 0 :(得分:5)
关于这一点,在C#中实际执行此操作的方法如下:
String.Format("{0:x2}", arrayOfByte[i]);
这与Java非常相似
String.format("%02x", arrayOfByte[i]);
这是一种更简单的方式来完成他们正在做的事情。
答案 1 :(得分: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位十六进制数字。