将Node.js转换为C#

3

我有一个Node.js函数

// @param {BigInteger} checksum
// @returns {Uint8Array}

function checksumToUintArray(checksum) {
  var result = new Uint8Array(8);
  for (var i = 0; i < 8; ++i) {
    result[7 - i] = checksum.and(31).toJSNumber();
    checksum = checksum.shiftRight(5);
  }
  return result;
}    

在C#中相应的代码是什么?

我认为应该这样写:

    public static uint[] ChecksumToUintArray(long checksum)
    {
        var result = new uint[8];
        for (var i = 0; i < 8; ++i)
        {
            result[7 - i] = (uint)(checksum & 31);
            checksum = checksum >> 5;         
        }
        return result;
    }

但我不确定。 我的主要疑惑是“BigInteger”类型(但不只是这个问题)。 任何帮助都将受到赞赏。


1
你应该至少返回 uint[] 或者重命名这个方法。 - C.Evenhuis
@C.Evenhuis,是的,你说得对,我漏掉了。 - zig
1个回答

2

UInt8代表“无符号8位整数”。在C#中,它对应的是byte,因为uint代表“无符号32位整数”。所以UInt8Array就是byte[]

Javascript中的BigInteger对应于C#中的BigInteger(来自System.Numerics dll或nuget包),而不是long。在某些情况下,long可能已经足够了。例如,如果javascript算法中使用BigInteger仅仅是因为javascript中没有64位整数这样的东西 - 那么用C#中的long替换它是可以的。但是一般情况下,在没有任何关于预期范围的额外信息的情况下 - javascript中BigInteger的范围要比C#中的long大得多。

有了这个知识,你的方法变成了:

public static byte[] ChecksumToUintArray(BigInteger checksum) {
    var result = new byte[8];
    for (var i = 0; i < 8; ++i) {
        result[7 - i] = (byte) (checksum & 31);
        checksum = checksum >> 5;
    }
    return result;
}

谢谢。js BigInteger是有符号的吗? - zig
在JavaScript中有几种大整数的实现方式。我记得最受欢迎的构造函数参数可以控制它是否带符号。 - Evk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接