这段java代码是我从网上得到的
import java.util.zip.CRC32;
public static short getCRC(String s, int i, byte bytes[])
{
CRC32 crc32 = new CRC32();
if (s != null)
{
for (int j = 0; j < s.length(); j++)
{
char c = s.charAt(j);
crc32.update(c);
}
}
crc32.update(i);
crc32.update(i >> 8);
crc32.update(i >> 16);
crc32.update(i >> 24);
for (int k = 0; k < bytes.length; k++)
{
byte byte0 = bytes[k];
crc32.update(byte0);
}
return (short) (int) crc32.getValue();
}
我尝试将其翻译为 Clojure:
(defn getCRC [s i bytes]
(let [crc32 (CRC32.)]
(if (not= s nil)
(for [c s] (.update crc32 (int c)))
)
(map #(.update crc32 (int (bit-shift-right i %))) [0 8 16 24])
(for [c bytes]
(.update crc32 (int c))
)
(.getValue crc32)
)
)
但似乎 .update
不起作用并且函数返回 0。
我评估了 let
主体中的每个 block ,它工作正常。
我还在 .getValue
之前放置了另一个带有数字的 .update
,它工作正常,函数的返回值变成了它的 CRC32;
但是当我将它们捆绑在一起时,返回值再次变为 0。
非常感谢任何帮助或想法!
最佳答案
由于您没有在代码中的任何位置强制执行它们的结果,因此不会实现序列,并且永远不会调用 .update
。
尝试将两者都替换为 doseq
- 专门处理副作用(除其他外并不懒惰)的迭代形式,并查看它如何改变结果:
(defn getCRC [s i bytes]
(let [crc32 (CRC32.)]
(if (not= s nil)
(doseq [c s] (.update crc32 (int c)))
)
(doseq [x [0 8 16 24]] (.update crc32 (int (bit-shift-right i x))))
(doseq [c bytes]
(.update crc32 (int c))
)
(.getValue crc32)
)
)
关于java - 字段方法在带有多个子 block 的 let 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936272/