2010-11-18 12 views
1

comment décoder un flux binaire en Lisp je l'ai fait avec avec ouverture -file et en passant un argument de type élément « (octet non signé 8), mais le retour en nombre pas une chaîne s'il vous plaît aidez-moi sur ce problèmedécodage lisp?

+3

Binaire est un octet. Vous devez ouvrir un port textuel. – leppie

Répondre

0

La question est un peu floue. Je pense que votre problème est que vous avez créé un fichier que vous avez écrit un (ou plusieurs) éléments de type (unsigned-byte 8), mais lorsque vous essayez de le lire, vous obtenez des caractères, pas des valeurs binaires. Si cela est le cas, vous devrez ouvrir le fichier avec :element-type '(unsigned-byte 8).

Si j'ai mal compris ce que vous voulez, veuillez éditer votre question et j'essaierai de répondre à votre question.

1

Votre problème n'est pas un problème, je pense. Lorsque vous ouvrez un fichier en mode binaire comme non signé-octet 8, vous spécifiez de lire le fichier, 8 bits à la fois, représenté par un nombre compris entre 0 et 255. Selon la façon dont vous le lisez, vous pouvez l'obtenir comme un ARRAY ou une liste. Un fichier 'texte' est un ensemble de nombres utilisant la représentation ASCII des caractères. Pour un texte plus sophistiqué, la représentation Unicode est utilisée, mais elle est plus proche d'un format binaire traditionnel que d'un texte.

Si vous essayez de lire un fichier PDF, vous devrez suivre le format de fichier pour obtenir des données significatives. Le site de Wotsit dispose d'une bibliothèque de formats de fichiers.

De votre question, il semble que vous appreniez simplement la programmation. Je ne recommande pas de travailler avec des fichiers PDF lorsque vous apprenez.

0

La réponse courte est que vous n'avez pas besoin de spécifier le :element-type si vous voulez lire dans les chaînes.

Le type '(unsigned-byte 8) fait référence à un numéro, pas comme dans les caractères C. En Lisp, le caractère est un type de données réel et vous auriez besoin d'ouvrir le fichier avec ce type d'élément pour obtenir des chaînes. La chose importante à réaliser est que :element-type détermine quels éléments de type de données dans le fichier seront analysés et retournés comme. Si vous lisez le hyperspec page on open, vous voyez que le type d'élément doit être soit un sous-type de caractère, soit un entier, soit un octet non signé ou signé. La valeur par défaut, cependant, est le caractère, qui produit des chaînes dans le format que votre lisp utilise.

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.