lisp解码?

时间:2010-11-18 04:36:03

标签: lisp

如何在lisp中解码二进制流 我使用with-open -file并传递一个参数作为元素类型'(无符号字节8)但返回数字而不是字符串 请帮我解决这个问题

4 个答案:

答案 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使用的任何格式生成字符串。