将Python struct.pack转换为erlang

0 python erlang pack

我试图实现以下python代码并在Erlang中获得相同的结果:

struct.pack('Q', long(20000001))
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Syl*_*oux 5

最接近相当于pack/ unpackErlang的使用实现了位语法.

由于Q格式unsigned long long通过(un)pack 映射到8个字节,您可以通过编写获得类似的东西:

40> <<V:64>>.
<<0,0,0,0,1,49,45,1>>
Run Code Online (Sandbox Code Playgroud)

请注意,在Erlang中,默认的endianess是big-endian.您可能想要更改它(或明确提及):

41> <<V:64/big>>.
<<0,0,0,0,1,49,45,1>>

42> <<V:64/little>>.       %% <= Given your example, probably what you want.
<<1,45,49,1,0,0,0,0>>

43> <<V:64/native>>.       %% <= Native endianness 
                           %% -- dependent of the CPU Erlang is running on.
<<1,45,49,1,0,0,0,0>>
Run Code Online (Sandbox Code Playgroud)

您可以使用相同的语法执行反向操作(此处明确指定signedness):

44> <<B:64/unsigned-big>> = <<V:64>>. %% big-endian (default) to big-endian
45> B.
20000001

46> <<S:64/unsigned-little>> = <<V:64>>. %% big-endian to little-endian
47> S.
84777848354635776

48> <<L:64/unsigned-little>> = <<V:64/little>>. %% little-endian to little-endian
<<1,45,49,1,0,0,0,0>>
49> L.                                         
20000001
Run Code Online (Sandbox Code Playgroud)

请注意,在将Python与Erlang进行比较时,二进制值的标准输出可能会引起混淆:

Python      Erlang
\x00    =>  <<0>>
\x01    =>  <<1>>
-       =>  <<45>>
1       =>  <<49>>  ! do not confuse the value 1 (0x01) and the character '1' !
Run Code Online (Sandbox Code Playgroud)

因此,Python二进制字符串\x01-1\x01\x00\x00\x00\x00是用<<1, 45, 49, 1, 0, 0, 0, 0>>Erlang 编写的.