2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面,了解如何操作的更多信息。

+1
Clojure

大家好,我在通过构建模糊测试工具学习Clojure时遇到了一些麻烦,我想要找到一种好的方法来修改字符串输入。背景是,最成功的模糊测试工具使用一些非常基本的技术,比如翻转位和字节。

我知道有翻转位的函数,但它们不能在字符串上正常工作,这是可以理解的。
所以我正在考虑将ASCII转换为二进制,进行转换,然后再转换回ASCII。

例如,如果我翻转“test”的位

01110100 01100101 01110011 01110100 = "test"
11110100 01100101 01110011 01110100 ;翻转第一个位
10110100 01100101 01110011 01110100 ;翻转前两个位

我也想翻转整个字节

01110100 01100101 01110011 01110100 = "test"
10001011 01100101 01110011 01110100 ;翻转字节

我的方法是转换字符串为二进制

(defn encode [s]
"test" -> \"01110100 01100101 01110011 01110100""
(trim (cl-format nil "~{~8,'0b ~}" (map #(int %) s))))

遍历字符串并翻转位,然后将它们转换回。

我已经努力了一整天,但还是找不到一个好的方法,所以我想看看各位专家是否有更优雅的解决方案。

我还想对整数字符串执行此操作,但不知道如何最好地使用(Integer/toBinaryString)函数

例如

(Integer/toBinaryString 87)
=> "1010111"

但是,由于它是一个字符串,所以我不能使用(bit-flip)或相关的库函数。

先谢谢大家了!

1 个答案

+2

这是一个很好的问题!

请注意,Clojure 字符串实际上是 Java 的 java.lang.Strings。因此,以下所有文档都是相关的

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

可能还有更好的方法,但我会先尝试使用 .getBytes

第二行显示了给定字符串的内容和底层字节之间的关系可能会很复杂(如果你能发现那个符号是什么,那么你就有额外的分数)。

第三种表达式表明,如果使用 cl-format 感到不适,可以从整数到二进制字符串进行转换。

然后,我们可以从数字向量中恢复字符串。

正如你所指出的,bit-flip 真的想要一个 long,尽管对于其他类型还有一些希望...

最终,我们在 \H 的最高位上翻转成功,但结果是否预期的呢?

user> (Character/getName 200)
"LATIN CAPITAL LETTER E WITH GRAVE"

我想可能是这样的。

你肯定置身于一些棘手的东西中。实际上,你正处于学习有关数字塔、Charset和诸如Java中的字节总是有符号等其他令人困惑的事情的危险之中。

user> (byte-array [200])
[-56]

希望这能帮到你!

非常感谢你的答案!这确实澄清了很多。我认为我有一个清晰的理解。
...