[gambit-list] Questions about reading from a port and u8vector
    Bradley Lucier 
    lucier at math.purdue.edu
       
    Sat Jun 27 00:22:43 EDT 2009
    
    
  
Ah, you beat me to it.  Here's my code, with a few tests.
Brad
;; Obviously, no error checking, etc.
;; You can use read-u8 to read the bytes from a port
;; and stick them into bytevector (or do something similar
;; with the bytes directly)
;; these procedures names and calling sequences taken from the  
bytevector
;; library of R6RS.  Unfortunately, IEEE 754 does not say what the
;; specific bit sequences representing the numbers are supposed to be,
;; but usually there are only two ways that machines do it.
(define (bytevector-ieee-double-native-ref bytevector k )
   ;; extracts a double (with native endianness) from bytevector,
   ;; which I take in gambit to be a u8vector, from the positions
   ;; k, k+1, ..., k+7
   (let ((aliased-vector (f64vector 0.)))
     (do ((i 0 (+ i 1)))
	((= i 8)
	 (f64vector-ref aliased-vector 0))
       (##u8vector-set! aliased-vector i (u8vector-ref bytevector (+  
k i))))))
(define (bytevector-ieee-double-native-set! bytevector k x )
   ;; inserts a double (with native endianness) into bytevector,
   ;; which I take in gambit to be a u8vector, into the positions
   ;; k, k+1, ..., k+7
   (let ((aliased-vector (f64vector x)))
     (do ((i 0 (+ i 1)))
	((= i 8))
       (u8vector-set! bytevector (+ k i) (##u8vector-ref aliased- 
vector i)))))
#|
On my powerpc Mac portable, result is
 > (load "binary.scm")
63
191
-1.
240
248
-1.5
"/Users/lucier/Desktop/binary.scm"
On my Intel box, the sign bit is on the other end (everything is  
reversed) so
you get
 > (load "binary.scm")
0
128
1.0000000000000284
0
8
1.0000000000004832
|#
(define bytevector (make-u8vector 8 0))
(bytevector-ieee-double-native-set! bytevector 0 1. )
(display (u8vector-ref bytevector 0)) (newline)
(u8vector-set! bytevector 0 (bitwise-ior 128 (u8vector-ref bytevector  
0)))
(display (u8vector-ref bytevector 0)) (newline)
(display (bytevector-ieee-double-native-ref bytevector 0))(newline)
(display (u8vector-ref bytevector 1)) (newline)
(u8vector-set! bytevector 1 (+ 8 (u8vector-ref bytevector 1)))
(display (u8vector-ref bytevector 1)) (newline)
(display (bytevector-ieee-double-native-ref bytevector 0))(newline)
    
    
More information about the Gambit-list
mailing list