在SWI-Prolog中反序列化32位浮点

在SWI-Prolog中反序列化32位浮点,prolog,swi-prolog,Prolog,Swi Prolog,有没有一种方法可以将序列化的浮点转换成SWI Prolog浮点,最好不用转换成C(如果必须的话,我会这样做) 我正在解析一个二进制流(OSC协议)。我得到32位IEEE 754浮点值,作为4个“代码”字符的列表。现在我想把它与普通的SWI Prolog浮点统一起来。在SWI Prolog中,有一个protobufs库,它有您需要的:float32\u code/2: ?- use_foreign_library(foreign(protobufs)). true. ?- float32_cod

有没有一种方法可以将序列化的浮点转换成SWI Prolog浮点,最好不用转换成C(如果必须的话,我会这样做)


我正在解析一个二进制流(OSC协议)。我得到32位IEEE 754浮点值,作为4个“代码”字符的列表。现在我想把它与普通的SWI Prolog浮点统一起来。

在SWI Prolog中,有一个protobufs库,它有您需要的:
float32\u code/2

?- use_foreign_library(foreign(protobufs)).
true.

?- float32_codes(X,[0x2b,0x52,0x9a,0x44]).
X = 1234.5677490234375

?- float32_codes(1234.5678,A).
A = [43, 82, 154, 68].

我还有一种独立的Prolog方法(使用SWI Prolog,不确定可移植性):


安妮,pack()不是为你工作吗?我想接收,plosc似乎只发送了我的稿件,如果你不介意我加入protobufs(见下文)。现在重读一遍,看起来像你的例子。你说“服务器”。Doh。
float_bits(_,  N, -1,  _,   N) :- !.
float_bits(Bs, N, Bit, Div, Ans) :-
    Nn is N + (getbit(Bs, Bit) * Div),
    DivN is Div / 2,
    BitN is Bit - 1,
    float_bits(Bs, Nn, BitN, DivN, Ans).
float_bits(Bs, N) :- float_bits(Bs, 1, 22, 0.5, N).

floating(Fl) -->
    [A, B, C, D],
    { [A,B,C,D] ins 0..255,
      Sign is (-1)**((A /\ 0b1000_0000) >> 7),
      Exp_ is (A /\ 0b0111_1111) << 1 + (B /\ 0b1000_0000) >> 7,
      Exp is 2**(Exp_ - 127),
      FracBits is (B /\ 0b0111_1111)<<16 + C<<8 + D,
      float_bits(FracBits, Frac),
      Fl is Sign * Exp * Frac }.
    ?- phrase(floating(0.15625), 
              [0b0011_1110, 0b0010_0000, 0b0000_0000, 0b00000000]).
    true.