windows超级运行框-表达式计算(6)—asc/ord/chr ASCII 码转换

1、环境准备

  1. windows 7,8,10,11操作系统
  2. ahk 2.x_64位

2、使用方式

asc 可以计算 asc字符 ,或者汉字,的数值,ord /chr 则是把数值转换为字符

当然有很多字符不可见,比如我们用 “{}” 包裹它

_map.set("0","{NUL}")   ;空 ^@
_map.set("1","{SOH}")   ;头标开始 ^A
_map.set("2","{STX}")   ;正文开始 ^B
_map.set("4","{EOT}")   ;正文结束 ^C
_map.set("5","{ENQ}")   ;查询 ^E
_map.set("6","{ACK}")   ;确认 ^F
_map.set("7","{BEL}")   ;震铃 ^G
_map.set("8","{BS}")    ;退格 ^H
_map.set("9","{TAB}")   ;水平制表符
_map.set("10","{LF}")   ;换行 ^J
_map.set("11","{VT}")   ;竖直制表符 ^K
_map.set("12","{FF}")   ;换页^L
_map.set("13","{回车}") ;回车
_map.set("14","{SO}")   ;移出 ^N
_map.set("15","{SI}")   ;移入 ^O
_map.set("16","{DLE}")  ;数据链路转意 ^P
_map.set("17","{DC1}")  ;设备控制符1 ^Q
_map.set("18","{DC2}")  ;设备控制符2 ^R
_map.set("19","{DC3}")  ;设备控制符3 ^S
_map.set("20","{DC4}")  ;设备控制符4 ^T
_map.set("21","{NAK}")  ;反确认 ^U
_map.set("22","{SYN}")  ;同步空闲 ^V
_map.set("23","{ETB}")  ;传输块结束 ^W
_map.set("24","{CAN}")  ;取消^X
_map.set("25","{EM}")   ;媒体结束 ^Y
_map.set("26","{SUB}")  ;替换 ^Z
_map.set("27","{ESC}")  ;转意 ^[
_map.set("28","{FS}")   ;文件分隔符 ^\
_map.set("29","{GS}")   ;组分隔符 ^]
_map.set("30","{RS}")   ;记录分隔符 ^6
_map.set("31","{US}")   ;单元分隔符 ^-
_map.set("32","{空格}") ;空格
_map.set("127","{^BASCK SPACE}") ;退格
  1.    输入win+R打开windows运行框 
  2.    在运行框中输入:asc a  ,输出:“97” 
  3.    在运行框中输入:asc a b c ,输出 “97 98 99  ”,输出多个字符的asc码值,中间有空格
  4.    在运行框中输入:asc 你 好,输出 “20320 22909” ,可以计算汉字的编码
  5.    在运行框中输入:   ord 32 , 输出 “{空格}”  ,不可见字符参考上面代码
  6.    在运行框中输入:chr 97 ,输出 “a” chr和ord的功能一样的、但是不能对unicode还原。
  7.   表达式按== 触发结果

3、演示

windows超级运行框-表达式计算(6)—asc/ord/chr ASCII 码转换

4、代码

#HotIf  winActive("运行") and winActive("ahk_class #32770")
#MaxThreadsPerHotkey 10
;在运行框中执行强大的计算功能,包括数学运算等
:*?:==::{
  try{
       rawText:=ControlGetText("Edit1","A") ;
       fullResult:=runbox.calculateExpression(rawText)
       if fullResult{
           ControlsetText(fullResult,"Edit1","A")
       }
       ControlSend("{END}","Edit1","A")
   }
}
#HotIf
;==========================================================================================================系统快捷键映射

;执行各种运算取值
class runbox
{

    ;执行比表达式计算,"==" 触发,callflag是其他函数调用该方法
    static calculateExpression(rawstr,callflag:=0)
    {
        ;计算字符的asc码值
        if inStr(rawStr,"asc ")==1{
            result:=this.ascOrChrExpression(trim(LTrim(rawStr,"asc")),1)
            fulltxt:= rawStr . "=" . result
            return fulltxt
        }
        ;计算数字所代表字符
        if inStr(rawStr,"ord ")==1 or inStr(rawStr,"chr ")==1{
            result:=this.ascOrChrExpression(Trim(LTrim(LTrim(rawStr,"ord"),"chr")),0)
            fulltxt:= rawStr . "=" . result
            return fulltxt
        }
    }

    ;计算asc码值
    static ascOrChrExpression(str,sacb)
    {
       str2:=RegExReplace(str,"\s+"," ")  ;让空格变小
       Loop parse ,str2 ," "{
         result .= (" " . ak.getAscOrChr(Trim(A_LoopField),sacb))
       }
       return result
    }


}
;==========================================================================================================系统快捷键映射


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class
class ak
{
    ;func 获取一个字符asc码值或是chr值
    static getAscOrChr(item,ascb:=1)
    {
         _map:=Map()
         _map.set("0","{NUL}")   ;空 ^@
         _map.set("1","{SOH}")   ;头标开始 ^A
         _map.set("2","{STX}")   ;正文开始 ^B
         _map.set("4","{EOT}")   ;正文结束 ^C
         _map.set("5","{ENQ}")   ;查询 ^E
         _map.set("6","{ACK}")   ;确认 ^F
         _map.set("7","{BEL}")   ;震铃 ^G
         _map.set("8","{BS}")    ;退格 ^H
         _map.set("9","{TAB}")   ;水平制表符
         _map.set("10","{LF}")   ;换行 ^J
         _map.set("11","{VT}")   ;竖直制表符 ^K
         _map.set("12","{FF}")   ;换页^L
         _map.set("13","{回车}") ;回车
         _map.set("14","{SO}")   ;移出 ^N
         _map.set("15","{SI}")   ;移入 ^O
         _map.set("16","{DLE}")  ;数据链路转意 ^P
         _map.set("17","{DC1}")  ;设备控制符1 ^Q
         _map.set("18","{DC2}")  ;设备控制符2 ^R
         _map.set("19","{DC3}")  ;设备控制符3 ^S
         _map.set("20","{DC4}")  ;设备控制符4 ^T
         _map.set("21","{NAK}")  ;反确认 ^U
         _map.set("22","{SYN}")  ;同步空闲 ^V
         _map.set("23","{ETB}")  ;传输块结束 ^W
         _map.set("24","{CAN}")  ;取消^X
         _map.set("25","{EM}")   ;媒体结束 ^Y
         _map.set("26","{SUB}")  ;替换 ^Z
         _map.set("27","{ESC}")  ;转意 ^[
         _map.set("28","{FS}")   ;文件分隔符 ^\
         _map.set("29","{GS}")   ;组分隔符 ^]
         _map.set("30","{RS}")   ;记录分隔符 ^6
         _map.set("31","{US}")   ;单元分隔符 ^-
         _map.set("32","{空格}") ;空格
         _map.set("127","{^BASCK SPACE}") ;退格
         ;添加常规字符
         Loop  94
            _map.set(String(A_index+32),chr(A_index+32))
         return ascb?(ak.maprget(_map,item) || ak.encodeUtf8(item)):(ak.mapget(_map,item) || chr(item))
    }

   ;通过value值来寻找key ,一般是一个key映射一个数组的时候,取数组中一个值来找key
   static maprget(mmap,value)
   {
      for k ,v in mmap{
         if (type(v)=="Array" and this.arrhas(v,value) )or(v==value){
            return k
          }
      }
      return
   }
    ;Func 帮助map获取值,优化原生map报错问题,ignoreCase是否忽略大小写
    static mapget(map1,key,ignoreCase:=0)
    {
        try{
          if ignoreCase{
            for k ,v in map1 {
                if k=key
                    return v
            }
          }
          return map1.get(key)
        }catch as e{
           return ""
        }
    }
   static encodeUtf8(str)
   {
        resultStr:=""
        Loop  Parse, str {
           resultStr:=resultStr . "\u" .  String(Ord(A_LoopField)>0x100 ? Format("{:04X}", Ord(A_LoopField) ):A_LoopField)
        }
        return resultStr
   }
}
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ak工具类class

5、总结

 由于很多操作代码可以复用,单个功能代码臃肿,

完整功能参考:windows超级运行框-表达式计算(12)汇总

各位大佬觉得还可以怎么操作? 欢迎评论区留言讨论!

给TA捐赠
共{{data.count}}人
人已捐赠
应用

windows超级运行框-表达式计算(4)—len计算字符串长度

2023-12-1 10:03:11

应用

windows超级运行框-表达式计算(7)—up/low大小写转换

2023-12-1 10:03:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索