明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 276|回复: 9

[经验] 关于 chr函数

[复制链接]
发表于 2021-9-10 09:47 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2021-9-10 10:03 编辑

这个函数的作用是:Converts an integer representing an ASCII character code into a single-character string
翻译过来就是:将表示ASCII字符代码的整数转换为单个字符的字符串
(chr 1) 返回“\001”
(chr 2)返回“\002”
(chr 3)返回“\003”
那(chr 8)返回什么?你可能毫不犹豫的说是“\008”,但错了,返回的是“\010”。
同样(chr 0)返回的也不是"\000",而是返回一个空字符。
(chr 11)返回“\013”
也就是说,这个函数的返回值和ASCII码并没有一 一对应的关系。斜杠后面的数字并不一定是ascii码,有些数字是没有对应的字符的。
因此用write-char和char函数配合来写二进制文件,存在很大风险。
写二进制文件要用函数write-byte , 这是一个保留函数。
下面是试验数据,(chr 0)到(chr 127)
"" "\001" "\002" "\003" "\004" "\005" "\006" "\007" "\010" "\t" "\n" "\013" "\014" "\r" "\016" "\017" "\020" "\021" "\022" "\023" "\024" "\025" "\026" "\027" "\030" "\031" "\032" "\e" "\034" "\035" "\036" "\037" " " "!" "\"" "#" "$" "%" "&" "'" "(" ")" "*" "+" "," "-" "." "/" "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" ":" ";" "<" "=" ">" "?" "@" "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "[" "\\" "]" "^" "_" "`" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" "{" "|" "}" "~" "\177" "

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 很给力!

查看全部评分

发表于 2021-9-10 10:19 | 显示全部楼层
你再试试ascii,是互逆函数

命令: (ascii (chr 8))
8
命令: (ascii (chr 10))
10
命令: (ascii (chr 11))
11
 楼主| 发表于 2021-9-10 10:50 | 显示全部楼层
不死猫 发表于 2021-9-10 10:19
你再试试ascii,是互逆函数

命令: (ascii (chr 8))

这个没有问题的。在lsp内部自己转换没问题,如果写成二进制文件,和别的语言交互,就有问题了。
发表于 2021-9-10 11:36 | 显示全部楼层
写二进制文件要用函数write-byte , 这是一个保留函数。这个是啥意思?是隐藏函数?
 楼主| 发表于 2021-9-10 14:29 | 显示全部楼层
liuyj 发表于 2021-9-10 11:36
写二进制文件要用函数write-byte , 这是一个保留函数。这个是啥意思?是隐藏函数?

是的,隐藏函数应该叫保留函数更确切。是桌子留着自己用的。它没有被隐藏,只是正常情况不能用。
发表于 2021-9-10 14:44 | 显示全部楼层
;;将一个十进制表写入为一个二进制文件
;;调用系统write-char函数
(defun file-WriteBinary10 (file lst10 / fo x)
        (setq fo (open file "w"))
        (foreach x lst10
                (if (zerop x)(setq x 256))
                (if (= 10 x)(setq x 266))
                (write-char x fo)
        )
        (close fo)
)
我想问问这样写有没有风险
 楼主| 发表于 2021-9-10 15:50 | 显示全部楼层
tryhi 发表于 2021-9-10 14:44
;;将一个十进制表写入为一个二进制文件
;;调用系统write-char函数
(defun file-WriteBinary10 (file lst1 ...

答案是:有
发表于 2021-9-10 23:57 | 显示全部楼层
本帖最后由 muwind 于 2021-9-11 22:03 编辑

我是这么理解的
000 对应的是空字符, 所以返回的是"" 空字符串在lisp是有存在意义的所以返回了这个东西。(= "\000"  "")  返回 T
010 对应的是回车 所以返回的"\n"  
返回的是字符串,在lisp中字符串的"\"是转义符号,在lisp中定义"\177"这个就代表了 DEL也就是ASCii 中127代表的东西 所以如果你真写出来,这个也就是个DEL不应该有什么问题。

256 返回的是 \000, 后面好像是循环的,比如 257和1应该是一样的。
发表于 2021-9-11 15:44 | 显示全部楼层
漏了一个(chr -1)
发表于 2021-9-11 22:38 | 显示全部楼层
本帖最后由 muwind 于 2021-9-11 22:43 编辑

这个和255是一样的其实
(ascii (chr -1) ) 返回就是 255
(=  (chr -256)  (chr 0)  (chr 256) )


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2020 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2021-9-17 23:49 , Processed in 0.484749 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表