2015-03-24 4 views

Répondre

5

L'équivalent le plus proche de pack/unpack dans Erlang est obtenu en utilisant le bit syntax.

Comme le format Q est mis en correspondance avec 8 octets unsigned long long par paquet (un), vous pouvez obtenir quelque chose de similaire en écrivant:

40> <<V:64>>. 
<<0,0,0,0,1,49,45,1>> 

Notez que dans Erlang le endianess par défaut est grand-boutiste. Vous pouvez changer cela (ou le mentionner explicitement):

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>> 

Vous pouvez effectuer l'opération inverse en utilisant la même syntaxe (ici spécifiant explicitement le 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 

S'il vous plaît noter la sortie standard des valeurs binaires peut être déroutante à première vue lors de la comparaison de Python à Erlang:

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

Ainsi, la chaîne binaire Python \x01-1\x01\x00\x00\x00\x00 est écrite <<1, 45, 49, 1, 0, 0, 0, 0>> dans Erlang.

+0

Merci pour votre réponse. Je cherche le remplacement de l'emballage. Le résultat de struct.pack ressemble à ceci: struct.pack ('Q', long (20000001)) '\ x01-1 \ x01 \ x00 \ x00 \ x00 \ x00' – Gadi

+1

@Gadi ??? Pour autant que je sache, '<>' produit le même résultat que le fragment de code Python. J'ai édité la réponse pour la rendre un peu plus claire. –

+0

Merci! était très utile – Gadi