1
我正在閱讀使用雞的二進制數據格式,到目前爲止,我已通過執行類似(fx+ (fxshl (read-byte) 8) (read-byte))
(Big Endian)的工作來獲取整數。如何讀取和寫入Chicken計劃的二進制浮點數?
我該如何讀寫浮動塊?我必須能夠讀寫IEEE 754-2008 32位和64位二進制浮點數。
我正在閱讀使用雞的二進制數據格式,到目前爲止,我已通過執行類似(fx+ (fxshl (read-byte) 8) (read-byte))
(Big Endian)的工作來獲取整數。如何讀取和寫入Chicken計劃的二進制浮點數?
我該如何讀寫浮動塊?我必須能夠讀寫IEEE 754-2008 32位和64位二進制浮點數。
到目前爲止,我還沒有找到任何好的庫來做到這一點,但我一起黑了一些有效的東西。請注意,我只有read-byte
和read-string
可供我作爲輸入操作。
;;
;; These are some unfun C routines to convert 4 int-promoted bytes to a float
;; by manually assembling the float using bitwise operators
;;
;; Caveat! These will only work on platforms in which floats are 32-bit Big
;; Endian IEEE754-2008 numbers and doubles are 64-bit Big Endian IEEE754-2008
;; numbers! Also, stdint.h.
;;
(define (readFloat)
(let ([c-read-float
(foreign-lambda* float
((int i1)
(int i2)
(int i3)
(int i4))
"uint8_t b1 = (uint8_t) i1;
uint8_t b2 = (uint8_t) i2;
uint8_t b3 = (uint8_t) i3;
uint8_t b4 = (uint8_t) i4;
uint32_t i = 0;
i = b1;
i = (i << 8) | b2;
i = (i << 8) | b3;
i = (i << 8) | b4;
float f = *(float*)&i;
C_return(f);")])
(let* ([i1 (read-byte)]
[i2 (read-byte)]
[i3 (read-byte)]
[i4 (read-byte)])
(c-read-float i1 i2 i3 i4))))
[bitstring egg](http://wiki.call-cc.org/eggref/4/bitstring)現在可用,這使得這更簡單很多。 – sjamaan 2015-09-19 12:58:35