我很欣赏有关如何将ASCII控制字符(通过HTML文本框提供)转换为十六进制或二进制表示的建议。
目前,我的网络应用程序采用ASCII控制字符 string 并转换值,例如,如果输入^C
,则返回值5e43
,表示“ ^“和”6“,不是control-c,以十六进制表示为02
。
我的想法是对输入运行正则表达式以检查控件字符,例如:^[\w]{1}
,然后从与正则表达式匹配的预定义表中返回值。
答案 0 :(得分:5)
您可以使用(. *in* read)
直接从 中读取,但字符对您的影响将取决于很多事情,特别是浏览器可能会出现的情况在开始之前将它们编码为http传输。
我维护一个安全的终端代理,必须处理控制字符的所有组合,所以我想我会传递一些注意事项:
最好的方法是编写一个小程序,一次从键盘读取一个字符,然后开始捣碎键盘,看看你能想出什么。
在这里,我将从 中读取一个角色,第一次点击 home ,结束第二次
clojure.core=> (. *in* read)
10
clojure.core=> (. *in* read)
10
很明显,一个字符不足以区分这两个字符,两个字符怎么样?
下一个示例将不会在repl中运行,因为repl会尝试为您“处理”控制字符,因此您必须创建一个新项目lein new esc
然后添加此代码lein uberjar
和java -jar esc-1.0.0-SNAPSHOT-standalone.jar
(ns esc.core
(:gen-class))
(defn -main []
(dorun (repeatedly #(println (. *in* read)))))
运行它并点击这两个键就产生了这个:
^[OF
27
79
70
10 <-- this is the newline
^[OH
27 <-- esc start marker look for this
79
72
10 <-- this is the newline
这是 esc - end
^[^[OF
27
27
79
70
10
到目前为止 ctrl 角色大奖得主 esc - 右箭头
^[[1;5C
27
91
49
59
53
67
10
以6个字节获得奖金。