java - 如何在 Clojure 中直接使用位?

标签 java clojure base64 hex byte

我开始解决在 https://cryptopals.com 设置的第一个问题另一天。我正在尝试同时学习 Clojure,所以我想我会在 Clojure 中完成所有练习。这些练习当然是出于学习目的,但我会竭尽全力不使用 clojure.core 和 Java 标准库之外的任何库。 第一个练习要求你编写代码,接收一个以十六进制编码的字符串,并输出一个以 base64 编码的字符串。这样做的算法相当简单:

  1. 获取与每个十六进制数字对相关联的字节(例如,十六进制 49 变为 01001001)。
  2. 检索到十六进制字符串的所有字节后,将字节列表转换为单个位序列。
  3. 对于每 6 位,返回一个 base64 字符(它们都以 6 位为单位表示)。

我在 Clojure 中实际表示/使用位和字节时遇到了问题(对原始字节进行操作是练习的要求之一)。我知道我可以对初始十六进制值执行 byte-array 并返回一个字节数组,但是我如何访问原始位以便我可以将一系列字节转换为 base64 编码字符串? 任何帮助或指导将不胜感激。

最佳答案

始终保持浏览器选项卡打开 Clojure CheatSheet .

对于详细的位工作,您需要像bit-andbit-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/

相关文章:

php - 将base64图像插入php中的mysql表

python - 使用 base64 编码,为什么我得到错误的答案?

java - 在 Java 中移动 JLabel

java - 向从表中提取的每一行添加计数

types - Clojure类型提示语法

clojure - 如何找出 Clojure 代理进入无效状态的原因

java - 字符串(文件的 base64)中存储的最大大小 - Java

java - 以编程方式设置 web.xml 配置

java - 传递一个类并返回不同的类作为 java 泛型方法的返回对象

Clojure:在调用者的命名空间中解析的宏中的限定关键字?