[英]How to create a bidirectional binary stream in Common Lisp?
我讀了如何在Common Lisp中創建二進制流(而不是文件)? ,它描述了如何創建二進制流而不是雙向流。 我試圖使用引用的庫自己做,但失敗了。 我的嘗試看起來像:
(defun make-test-binary-stream ()
(make-two-way-stream (flexi-streams:make-in-memory-input-stream
(vector))
(flexi-streams:make-in-memory-output-stream)))
我用它像:
(let ((str (make-test-binary-stream)))
(lisp-binary:write-float :double 123.45d0 :stream str)
(lisp-binary:read-binary-type 'double-float str))
我期望的結果是123.45d0
,但它返回0.0d0
。
我怎么能創建一個行為與我期望的二進制流,允許我寫一個值,然后讀回相同的值? 我想要這樣一個流來測試編碼和解碼函數的正確性,這些函數將流作為輸入和輸出流。
雙向流S
是一對(I,O)
,其中I
是輸入流, O
是輸出流。 兩個流都不一定相關,它只是意味着當你從S
讀取時,你從I
讀取,當你寫入S
,你寫入O
在這里,您嘗試從由空序列支持的內存中的流中讀取。 流只是給出序列中的項目,但作為流; 在這里,流立即到達文件結尾。
不是直接回答問題,但我有時會使用lisp-binary ,我測試的方式如下:
(with-input-from-sequence
(in (with-output-to-sequence (out)
(write-float :double 123.45d0 :stream out)))
(read-binary-type 'double-float in))
讓我們分解:
(flex:with-output-to-sequence (out)
(write-float :double 123.45d0 :stream out))
上述局部綁定out
一個寫入到一個隱藏,內存序列的流,並最終返回序列。 整個表達式返回一個字節緩沖區:
#(205 204 204 204 204 220 94 64)
這個緩沖器被給予with-input-from-sequence
結合in
到本地流,從該序列中讀取數據。 read-binary-type
使用該輸入流來解碼值。
(defpackage :so (:use :cl :lisp-binary :flexi-streams :osicat))
(in-package :so)
osicat系統有一個宏來在輸入和輸出模式下打開一個臨時文件:
(with-temporary-file (io :element-type '(unsigned-byte 8))
(write-float :double pi :stream io)
(file-position io 0)
(read-binary-type 'double-float io))
我找不到一個內存i / o流的現有實現,它從同一個向量讀取和寫入; 你可以用兩個共享內部向量的靈活流來破解(但這很危險,有些情況下數據一致性會中斷),或者從灰色流中構建一個; 另見cl-stream 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.