如何在lisp中解码二进制流 我使用with-open -file并传递一个参数作为元素类型'(无符号字节8)但返回数字而不是字符串 请帮我解决这个问题
答案 0 :(得分:2)
;;; Flexi-Streams "bivalent streams" solve the binary vs. character stream problem.
;;; You'll want to install QuickLisp and understand the REPL * and ** variables:
(require 'flexi-streams) ;; or (ql:quickload 'flexi-streams)
(with-open-file (out "foo.text" :direction :output)
(write-line "Foo" out)) ; "Foo"
(with-open-file (in "foo.text")
(read-line in)) ; "Foo", NIL
(with-open-file (in "foo.text" :element-type '(unsigned-byte 8))
(read-line in)) ;; read-line wrong stream type error
(with-open-file (in "foo.text" :element-type '(unsigned-byte 8))
(let ((s (make-array 3)))
(read-sequence s in) s)) ; #(70 111 111)
(map 'list #'code-char *) ; (#\F #\o #\o)
(map 'string #'code-char **) ; "Foo"
(with-open-file (raw "foo.text" :element-type 'flexi-streams:octet)
(with-open-stream (in (flexi-streams:make-flexi-stream raw))
(read-line in))) ; "Foo", NIL
;; Thanks to Edi Weitz for providing this essential tool.
答案 1 :(得分:1)
你的问题不是问题,我想。当您以二进制模式打开文件为无符号字节8时,您指定读取文件,8位作为时间,表示为0到255之间的数字。根据您的读取方式,您可能会将其作为阵列或列表。
'text'文件是一组使用ASCII字符表示的数字。对于更复杂的文本,使用Unicode表示,但它更接近传统的二进制格式而不是文本格式。
如果您尝试阅读PDF文件,则必须按照文件格式从中获取有意义的数据。 Wotsit的网站有一个文件格式库。
从你的问题来看,听起来好像你只是在学习编程。我不建议您在学习时使用PDF。
答案 2 :(得分:0)
这个问题有点不清楚。我认为您的问题是您创建了一个文件,您已经编写了一个(或多个)(unsigned-byte 8)
类型的元素,但是当您尝试读取它时,您将获得字符,而不是二进制值。
如果是这种情况,则需要使用:element-type '(unsigned-byte 8)
打开文件。
如果我误解了你想要的东西,请编辑你的问题,我会尽力回答你的问题。
答案 3 :(得分:0)
简短的回答是,如果您想读取字符串,则无需指定:element-type
。
类型'(unsigned-byte 8)
是指一个数字,而不是C中的字符。在Lisp中,字符是实际的数据类型,您需要使用此元素类型打开文件以获取字符串。要认识到的重要一点是:element-type
确定文件中的哪些数据类型元素将被解析并返回为。如果您阅读hyperspec page on open,您会看到元素类型必须是字符的子类型,整数,或者是无符号字节或有符号字节。但是,默认值是character,它以lisp使用的任何格式生成字符串。