我开始解决在 https://cryptopals.com 设置的第一个问题另一天。我正在尝试同时学习 Clojure,所以我想我会在 Clojure 中完成所有练习。这些练习当然是出于学习目的,但我会竭尽全力不使用 clojure.core 和 Java 标准库之外的任何库。 第一个练习要求你编写代码,接收一个以十六进制编码的字符串,并输出一个以 base64 编码的字符串。这样做的算法相当简单:
- 获取与每个十六进制数字对相关联的字节(例如,十六进制
49
变为01001001
)。 - 检索到十六进制字符串的所有字节后,将字节列表转换为单个位序列。
- 对于每 6 位,返回一个 base64 字符(它们都以 6 位为单位表示)。
我在 Clojure 中实际表示/使用位和字节时遇到了问题(对原始字节进行操作是练习的要求之一)。我知道我可以对初始十六进制值执行 byte-array
并返回一个字节数组,但是我如何访问原始位以便我可以将一系列字节转换为 base64 编码字符串?
任何帮助或指导将不胜感激。
最佳答案
始终保持浏览器选项卡打开 Clojure CheatSheet .
对于详细的位工作,您需要像bit-and
、bit-test
等函数。
如果您只是解析十六进制字符串,请参阅带有基数选项的 java.lang.BigInteger:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigInteger.html#%3Cinit%3E(java.lang.String,int)
java.lang.Long/parse( string, radix ) 也很有用。
对于base64部分,你可能对the tupelo.base64 functions感兴趣.这个库函数是将十六进制字符串转换为 base-64 字符串真正需要的全部,尽管它可能不算作你的作业!
请注意,Java 包含 base-64 函数:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Base64.html
另外请记住,您可以通过查看 Clojure 和 Tupelo 库的源代码来获得灵感。
还有,请记住,Clojure 的超能力之一是能够用 native Java 编写低级或性能关键代码,然后链接所有*.clj
和 *.java
文件合并到一个程序中(您可以使用 Leiningen 一步编译和链接所有内容)。
关于java - 如何在 Clojure 中直接使用位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877968/