Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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
如何将校验和代码从C#转换为Java?_C#_Java - Fatal编程技术网

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

如何将校验和代码从C#转换为Java?,c#,java,C#,Java,我需要帮助将此代码从C#转换为Java Java版本将返回long,而不是ulong 编辑:我什么都没试过,因为我不知道如何处理最后一行ulong.MaxValue。基本上,我需要的最终结果是生成与C#中的(长)GetChecksum(buffer)相同的数字,与java中的GetChecksum(buffer)相同。 我对java非常陌生,这就是我问这个问题的原因 编辑2:这是最终的解决方案。许多有益的评论。谢谢你们 public static byte[] getChecksum(byte[

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

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

编辑:我什么都没试过,因为我不知道如何处理最后一行ulong.MaxValue。基本上,我需要的最终结果是生成与C#中的(长)GetChecksum(buffer)相同的数字,与java中的GetChecksum(buffer)相同。 我对java非常陌生,这就是我问这个问题的原因

编辑2:这是最终的解决方案。许多有益的评论。谢谢你们

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();
    }

编辑2:太糟糕了,这个问题被贬低了。它有许多有用的注释。

因为Java不会在算术溢出上抛出错误,所以您应该能够执行以下操作:

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

return sum;
基于您希望得到与C#完全相同的结果(以二进制形式而不是以值形式)的假设,对返回进行了简化
ulong.MaxValue
是1的64位,在有符号长中为-1,用于取消“+1”

编辑:我在这里撒了个谎。结果应该是逻辑和,这是由于默认的两个恭维实现,不容易做到的。你应该考虑大整数解决方案。

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);
这看起来很难看,但我尽可能多地使用本地算术


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

ulong
在Java中没有等价物。但是,您可以使用

此外,由于字节是用Java签名的,因此必须转到
short
才能得到0-255


编辑:如果您的签名需要使用
byte[]
而不是
short[]
进行匹配,那么您就有了答案。

您遇到了什么问题?Java和C已经非常相似了,这是一个非常简单的函数….
byte
在C中是无符号的,那么在Java中应该使用什么类型呢?C#中的
foreach
循环在Java中不存在,什么样的结构可以取代它?您将如何处理C#在Java中返回无符号类型但返回有符号类型?你担心溢出吗?(这些是你应该考虑的问题,用谷歌搜索,而不是让陌生人来写你的转换。)这个问题其实很有趣,因为Java
byte
数据类型是有符号的,而Java没有
ulong
数据类型。您是否要将c生成的校验和与Java生成的校验和进行比较?因为如果你是,你会毁了某人的一天…@TomislavMarkovski:当你添加你的编辑时,这变成了一个坏问题(“给我发个好问题”)。谢谢,我发现最后一行也让人困惑,这就是为什么我问这个问题。将尝试此代码。可能我只是缺少了一些东西,但是:100000000-10+1!=10@32bitkid你们的评论只是证明你们不知道计算机是如何做算术的,在你们做出不负责任的评论之前,你们甚至懒得去谷歌。Tomislav Markovski:确保以二进制格式比较结果,例如通过转换为字节,这样第一位在Java中就不会被视为符号位。@billc.cn geez!防御性强!我完全知道存储整数有两个好处。endianness呢?它可能至少值得一提,而不是你神奇的“+1”。我仍然很确定这是不对的,但我在工作,所以我无法验证。@billc.cn,不,我不是那个投票否决你之前答案的人。我只想说,由于符号扩展,short-to-short不能解决符号问题。@billc.cn哪个cast-to-short?我将强制转换为long,但不是short(我可以看到)。您将输入更改为short[],我相信海报将在cast的包装中实现,这可能会导致问题。我认为我们最好匹配签名并处理函数中的所有问题。:)billc.cn是正确的。上面的代码需要修改:sum=sum.add(biginger.valueOf((long)((char)s&0xFF));(是的,我想我应该改变我的态度。我假设得太多了。谢谢你指出。)
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);
private static BigInteger Checksum(short[] data)
{
    BigInteger sum = BigInteger.ZERO;  
    for (short s : data)  
        sum = sum.add(BigInteger.valueOf((long)s)); 

    return new BigInteger("18446744073709551615", 10).subtract(sum).add(BigInteger.ONE); 
}