Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java到C#:从文档散列计算代码_C#_Algorithm_Sha256 - Fatal编程技术网

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.

我有Java代码示例,说明如何计算验证代码。我必须将Java代码转换为C#

首先,代码计算如下:

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..]
with
var 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}";            
    }
}