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

欢迎!请参阅 关于 页面了解更多有关如何使用此工具的信息。

+1
Clojure

大家好,我正在通过构建fuzzer学习clojure,但我在寻找一种好的解决方案来修改字符串输入时遇到了一些麻烦。简短介绍一下,最成功的fuzzer使用非常基础的技巧来翻转位和字节。

我知道有位反转函数,但它们对字符串似乎不起作用,这是可以理解的。
因此,我正在考虑将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.String。所以,所有这些文档都是相关的

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

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

第二行显示,一个给定字符串的内容与底层字节之间的关系可能是复杂的(即使我的字体放弃了,也要为发现那个字符点个赞)。

第三行显示了如何从整数到二进制字符串的转换,以防不适应 cl-format

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

就像你说的那样,位翻转实际需要 long 类型,尽管其他类型还有 一些希望...

最终,我们成功地把 \H 的最高位反转了,但结果符合预期吗?

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

我觉得可能是这样。

你确实在这里接触到了一些很复杂的东西。事实上,你严重处于学习关于数字金字塔、Charset 以及像 Java 中的字节总是有符号这样的令人混淆的事情的风险。

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

希望这有所帮助!

非常感谢你的回答!它帮我解决了很多问题。我认为我对这一点有了坚定的了解。
...