gpt4 book ai didi

c# - 如何将此校验和代码从 C# 转换为 Java?

转载 作者:行者123 更新时间:2023-12-02 08:04:51 25 4
gpt4 key购买 nike

我需要帮助将此代码从 C# 转换为 Java。

    public static ulong GetChecksum(byte[] data)
{
ulong sum = 0;
foreach (var item in data)
sum += item;

return ulong.MaxValue - sum + 1;
}

Java 版本将返回 long,而不是 ulong。

编辑:我还没有尝试过任何东西,因为我不知道如何处理最后一行 ulong.MaxValue。基本上,我需要的最终结果是生成与 C# 中的 (long)GetChecksum(buffer) 相同的数字,以与 java 中的 getChecksum(buffer) 相同。我对 java 很陌生,这就是我问这个的原因。

Edit2:这是最终的解决方案。许多有用的评论。谢谢你们。

public static byte[] getChecksum(byte[] data) {
BigInteger sum = BigInteger.ZERO;
for (byte s : data)
sum = sum.add(BigInteger.valueOf((long) ((char) s & 0xFF)));

return new BigInteger("FFFFFFFFFFFFFFFF", 16).subtract(sum).add(BigInteger.ONE).toByteArray();
}

Edit2:太糟糕了,这个问题被降级了。它有许多有用的评论。

最佳答案

由于 Java 不会在算术溢出时抛出错误,因此您应该能够执行以下操作:

long sum = 0;
for (byte b : data)
sum += (long) b;

return sum;

基于您想要与 C# 中完全相同的结果(二进制而不是值)的假设,简化了返回。 ulong.MaxValue 是 64 位的 1,在有符号长整型中为 -1,取消了“+1”。

编辑:我在这里撒了谎。结果在逻辑上应该是 -sum,由于默认的补码实现,这不容易完成。您应该考虑使用 BigInteger 解决方案。

Edit2:由于有符号减法的行为不均匀,因此无法简单地模拟无符号运算ulong.MaxValue - sum。我建议你做的是:

long sum = 0;
for (byte b : data)
sum += ((long) b) & 0xFFL; // To prevent sign-expansion. Sorry, I missed this the first time as well.

return (new BigInteger("FFFFFFFFFFFFFFFF", 16)).subtract((new BigInteger(Long.toHexString(sum), 16))).add(BigInteger.ONE);

这看起来很难看,但我尽力尽可能地使用 native 算术。

您可以使用 BitInteger 的“toByteArray()”方法来获取原始二进制文件以进行比较。不要使用 longValue(),因为它会破坏第一位。

关于c# - 如何将此校验和代码从 C# 转换为 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com