декодирование лисп? - PullRequest
       4

декодирование лисп?

1 голос
/ 18 ноября 2010

как декодировать двоичный поток в lisp я сделал с with-open -file и передавая аргумент как тип элемента (беззнаковый байт 8), но возвращая как числа, а не как строку пожалуйста, помогите мне в этой проблеме

Ответы [ 4 ]

2 голосов
/ 26 декабря 2016
;;; 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 голос
/ 20 ноября 2010

Ваша проблема не проблема, я думаю .Когда вы открываете файл в двоичном режиме как 8-разрядный без знака, вы указываете чтение файла, 8-битное время, представленное как число от 0 до 255. В зависимости от того, как вы читаете его, вы можете получить его какARRAY или LIST.

Текстовый файл - это набор чисел, использующий представление символов ASCII.Для более сложного текста используется представление Unicode, но оно ближе к традиционному двоичному формату, чем к текстовому.

Если вы попытаетесь прочитать файл PDF, вам придется следовать формату файла для получения значимых данных из него.На сайте Wotsit есть библиотека форматов файлов.

Судя по вашему вопросу, это звучит так, как будто вы только изучаете программирование.Я не рекомендую работать с PDF-файлами, когда вы только учитесь.

0 голосов
/ 23 сентября 2016

Короткий ответ: вам не нужно указывать :element-type, если вы хотите читать в строках.

Тип '(unsigned-byte 8) относится к числу, а не к символам, как в C. В Лиспе символ представляет собой фактический тип данных, и вам нужно открыть файл с этим типом элемента, чтобы получить строки. Важно понимать, что :element-type определяет, какие элементы типа данных в файле будут проанализированы и возвращены как. Если вы читаете страницу гиперспецификации при открытии , вы увидите, что тип элемента должен быть либо подтипом символа, целого числа, либо байтом без знака или со знаком. Однако по умолчанию это символ, который генерирует строки в любом формате, который использует ваш lisp.

0 голосов
/ 18 ноября 2010

Вопрос немного неясен.Я думаю, что ваша проблема в том, что вы создали файл, в который вы записали один (или несколько) элементов типа (unsigned-byte 8), но при попытке прочитать его вы получаете символы, а не двоичные значения.

Еслив этом случае вам нужно будет открыть файл с помощью :element-type '(unsigned-byte 8).

Если я неправильно понял, что вы хотите, отредактируйте ваш вопрос, и я постараюсь ответить на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...