2016-07-04 200 views
-1

我一直致力于将一个大型javascript程序转换为java。但是我不确定在这几行中发生了什么,以及如何将它变成java。将javascript转换为java

int val = 0; //already turned to java 

    int o = hash.length() % 4; //already turned to java 

for (var i = o > 0 ? o - 4 : 0; i < hash.length; i += 4) { 
     val = ((val << 16) + parseInt(hash.substring(i, i+4), 16)) % mod; 
    } 

它是一个可分的功能。散列是一个字符串(特别是一个sha256字符串散列)。任何人都可以帮我弄清楚这个奇怪的forloop?谢谢。

我知道parseInt将它变成了基数16,因为我已经在代码中翻译了该部分的其他地方。

+0

for-clause只是一个三元运算符,用于将i设置为o-4或0。<< <<'部分是一个按位运算符,但我不能100%确定该计算的结果是什么。 – Shilly

+3

[位移和位移运算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html),[Java Conditional Operator](https://docs.oracle.com/javase/) tutorial/java/nutsandbolts/op2.html),[Integer。parseInt函数(https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String中,%20int))。除了parseInt的用法外,唯一的非Java语法是'var i',它会变成'int i'。当然,'hash.length'变成'hash.length()'。 – nbrooks

+0

我的理解力不够,以前从来没有见过位运算符和位移运算符,谢谢你清理这个@nbrooks – Lain

回答

3

对于i = O 其中o是大于零。别的O-4设定为0

直到 我小于每次

在每次循环hash.length

迭代 i增加4: val为等于 -

val左移16位 加 剩余的整数值与基数16(散列的第i个元素到i + 4元素)和“mod”

您还没有提供mod的任何解释。

substring()方法从两个指定索引之间的字符串中提取字符,并返回新的子字符串。

该方法提取“start”和“end”之间的字符串中的字符,不包括“end”本身。

如果“start”大于“end”,则此方法将交换两个参数,即str.substring(1,4)== str.substring(4,1)。

如果任一“启动”或“停止”小于0,它将被视为好像它是0。

parseInt() function

它分析输入为一个整数加上所述第二参数指定的基数即数字系统的基地在这种情况下它是一个十六进制

Bitwise left Shift, the << operator

VAL如我猜已经在十六进制数系统中的值,从而这基本上在十进制系统中会像一个减1

Ternary operator , your for loop

的唯一操作者可以采取三个参数,基本上短手用于如果{}否则{}环。

-1
int val = 0; //already turned to java 

int o = hash.length() % 4; //already turned to java 

for (int i = o > 0 ? o - 4 : 0; i < hash.length; i += 4) { 
    val = ((val << 16) + Integer.parseInt(hash.substring(i, i+4), 16)) % mod; 
} 

这是java代码

+0

这不会编译,也不会回答代码正在做什么的问题。 – nbrooks

+0

@nbrooks“如何将它变成java” - 这是问题的这一部分的答案。功能的东西已经在评论中 – Blobonat