Java到C#:从文档散列计算代码
我有Java代码示例,说明如何计算验证代码。我必须将Java代码转换为C# 首先,代码计算如下:Java到C#:从文档散列计算代码,c#,algorithm,sha256,C#,Algorithm,Sha256,我有Java代码示例,说明如何计算验证代码。我必须将Java代码转换为C# 首先,代码计算如下: integer(SHA256(hash)[-2: -1]) mod 10000 在这里,我们获取SHA256结果,从中提取最右边的2个字节,将它们解释为大端无符号整数,并获取十进制中的最后4位进行显示 Java代码: public static String calculate(byte[] documentHash) { byte[] digest = DigestCalculator.
integer(SHA256(hash)[-2: -1]) mod 10000
在这里,我们获取SHA256结果,从中提取最右边的2个字节,将它们解释为大端无符号整数,并获取十进制中的最后4位进行显示
Java代码:
public static String calculate(byte[] documentHash) {
byte[] digest = DigestCalculator.calculateDigest(documentHash, HashType.SHA256);
ByteBuffer byteBuffer = ByteBuffer.wrap(digest);
int shortBytes = Short.SIZE / Byte.SIZE; // Short.BYTES in java 8
int rightMostBytesIndex = byteBuffer.limit() - shortBytes;
short twoRightmostBytes = byteBuffer.getShort(rightMostBytesIndex);
int positiveInteger = ((int) twoRightmostBytes) & 0xffff;
String code = String.valueOf(positiveInteger);
String paddedCode = "0000" + code;
return paddedCode.substring(code.length());
}
public static byte[] calculateDigest(byte[] dataToDigest, HashType hashType) {
String algorithmName = hashType.getAlgorithmName();
return DigestUtils.getDigest(algorithmName).digest(dataToDigest);
}
因此,从Base64字符串中选择int C#:
2AFAX+nH5qNYrfM+D7F6cKAaCKLLA23pj8ro3SksqwsdwmC3xTndKJotewzu7HlDy/DiqgkR+HXBiA0sW1x0Q==
计算的代码应等于:3676
如何实现这一点?VS2017及更早版本的用户(可能一直到VS2013)可以替换行var last2=hash[^2..]
withvar last2=hash.Skip(hash.Length-2.ToArray()代码>。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetCode("2afAxT+nH5qNYrfM+D7F6cKAaCKLLA23pj8ro3SksqwsdwmC3xTndKJotewzu7HlDy/DiqgkR+HXBiA0sW1x0Q=="));
}
public static string GetCode(string str)
{
var sha = System.Security.Cryptography.SHA256.Create();
var hash = sha.ComputeHash(Convert.FromBase64String(str));
var last2 = hash[^2..];
var intVal = ((int) last2[0]) * 0x0100 + ((int) last2[1]);
var digits = intVal % 10000;
return $"{digits:0000}";
}
}