【问题标题】:Translating javascript to java将javascript翻译成java
【发布时间】:2016-07-04 15:12:06
【问题描述】:

我一直致力于将大型 javascript 程序转换为 java。但是我不确定这几行中发生了什么以及如何将其转换为 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;
    }

它是一个可分割的函数。 hash 是一个字符串(特别是 sha256 字符串散列)。谁能帮我弄清楚这个奇怪的forloop?谢谢。

我知道 parseInt 正在将其转换为基数 16,因为我已在代码中的其他位置翻译了该部分。

【问题讨论】:

  • for 子句只是一个三元运算符,用于将 i 设置为 o - 4 或 0。&lt;&lt; 部分是按位运算符,但我不能 100% 确定结果是什么该计算是。
  • Bitwise and Bit Shift OperatorsJava Conditional OperatorInteger.parseInt。除了 parseInt 用法之外,唯一的非 Java 语法是 var i,它将变为 int i。当然hash.length 变成hash.length()
  • 我之前从未见过按位和移位运算符,我缺乏理解,感谢您清除此问题@n*s

标签: javascript java


【解决方案1】:

对于 i = o 其中 o 大于零。否则 o-4 设置为 0

直到 i 小于 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)。

如果 "start" 或 "stop" 小于 0,则将其视为 0。

parseInt() function

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

Bitwise left Shift, the << operator

我猜测的 val 已经是十六进制数字系统中的一个值,所以这基本上在十进制系统中就像一个负 1

Ternary operator , your for loop

唯一可以接受三个参数的运算符,基本上是 if{} else{} 循环的简写。

【讨论】:

    【解决方案2】:
    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代码

    【讨论】:

    • 这不会编译,也不会回答代码在做什么的问题。
    • @n*s “如何把它变成 java” - 这是这部分问题的答案。功能性的东西已经在 cmets 中