簡體   English   中英

如何在Common Lisp中創建雙向二進制流?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM