
Hi, I don`t know if this is the right group to ask, but I would appreciate some help with the following. The aim is to read a binary file from lisp. The file contains a set of records, every record consists of the following data: (cffi:defcstruct ppp (nr :unsigned-int) (name :char :count 32) ;; this is the problematic line 1 (alias :char :count 12) ;; this is the problematic line 2 (m :double) (t :double) (p :double) (v :double)) Now the problematic line 1 should read 32 characters from an ascii-encoded file. For that, I use the (defun test .....) (see below). The test converts the cstruct with-foreign-slots through (cffi:foreign-string-to-lisp name). The output of (test) is: (1 "ABC ABC ÙÎ÷Só<@fffffŽ`@" "ABC ÙÎ÷Só<@fffffŽ`@" 28.9d0 132.4d0 3774.0d0 0.0d0) where: (length (second *))
60 (length (third **)) 28 whereas I would expect the output to be: (1 "ABC " "ABC " 28.9d0 132.4d0 3774.0d0 0.0d0)
with length second = 32 and length third = 12. Am I missing something? I tried: (cffi:foreign-string-to-lisp name 32) (cffi:foreign-string-to-lisp name 12) this works, the correct output is presented. But how can I get the length of the char in the cstruct PPP? Thank you very much, best regards, mosi ;;---- TEST.lisp ------ (in-package :cl-user) (eval-when (:compile-toplevel :load-toplevel) (require :cffi)) (defpackage :test (:use :cl)) (in-package :test) (cffi:defcfun "fopen" :pointer (path :string) (mode :string)) (cffi:defcfun "fread" :unsigned-long (ptr :pointer) (size :unsigned-long) (nmemb :unsigned-long) (stream :pointer)) (cffi:defcfun "fclose" :int (fp :pointer)) (cffi:defcstruct ppp (nr :unsigned-int) (name :char :count 32) (alias :char :count 12) (mw :double) (tc :double) (pc :double) (vc :double)) (defparameter *file-path* "C://the-file.bin") ;; (defun test ()) (let (file) (unwind-protect (progn (setf file (fopen *file-path* "rb")) (cffi:with-foreign-object (struct 'ppp) (fread struct (cffi:foreign-type-size 'ppp) 1 file) (cffi:with-foreign-slots ((nr name alias m t p v) struct ppp) (list nr (cffi:foreign-string-to-lisp name) (cffi:foreign-string-to-lisp alias) mw tc pc vc)))) (when file (fclose file)))) ;; run this by (test)