【问题标题】:How can I directly work with bits in Clojure?如何在 Clojure 中直接使用位?
【发布时间】:2020-01-12 15:14:05
【问题描述】:

前几天我开始解决https://cryptopals.com 设置的第一个问题。我正在尝试同时学习 Clojure,所以我想我会在 Clojure 中实现所有练习。这些练习当然是为了学习目的,但我会尽量不使用除 clojure.core 和 Java 标准库之外的任何库。 第一个练习要求您编写代码,接收以十六进制编码的字符串并输出以 base64 编码的字符串。执行此操作的算法相当简单:

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

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

【问题讨论】:

    标签: java clojure base64 hex byte


    【解决方案1】:

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

    对于详细的位工作,您需要bit-andbit-test 等函数。

    如果您只是解析一个十六进制字符串,请参阅带有 radix 选项的 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 的超能力之一是能够用原生 Java 编写低级或性能关键代码,然后链接所有*.clj*.java 文件合并到一个程序中(您可以使用 Leiningen 一步编译和链接所有内容)。

    【讨论】:

    • 谢谢!非常感激。是的,我没有看过 tupelo 的代码,因为我想看看我是否可以自己做,而不看任何例子。但看起来 tupelo 只是在调用 Java 的 Base64 编码器。
    • 您总是可以自己进行位移/位掩码,并截断整数除以 64 以提取 BigInteger 的 6 位 (2^6=64) 块,然后使用查找表。您还可以查看 Java BigInteger 源代码以获取想法。
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多