大家好,我通过构建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))))
遍历字符串,并 somehow反转位,然后转换回。
我已经为此抗争了一整天,但我想看看是否有更多的优雅解决方案。
同时也想为整数做这件事,但不确定如何最好地使用 (Integer/toBinaryString) 函数
例如
(Integer/toBinaryString 87)
=> "1010111"
但是它是一个字符串,所以我不能做 (bit-flip) 或相关库函数。
非常感谢!