任何其他语言是否支持Erlang以外的位串?

时间:2014-07-20 15:46:04

标签: erlang bit bitstring

我经常处理"二进制"使用某种类型的COMMAND | LENGTH | PARAMETERS结构交换信息的协议,其中PARAMETERS是任意数量的TAG | LENGTH | VALUE元组。 Erlang通过模式匹配简化了在消息中提取值的工作,如:

M = <<1, 4, 1, 2, 16#abcd:16>>. <<1,4,1,2,171,205>>

使用M bitstring(一条遵循COMMAND | LENGTH | PARAMETERS格式的消息),我可以利用Erlang模式匹配来提取命令,长度,参数:

<<Command:8,Length:8,Parameters/binary>> = M. <<1,4,1,2,171,205>> Parameters. <<1,2,171,205>>

对于管理&#34; bit-nibble-byte&#34;--oriented协议,这是非常宝贵的!

是否有任何其他语言接近支持这样的语法,即使是通过附加库?

5 个答案:

答案 0 :(得分:3)

https://pypi.python.org/pypi/bitstring/3.1.3这样的python允许你在同一级别做很多工作。

从你的例子:

from bitstring import BitStream
M = BitStream('0x01040102abcd')
[Command, Length, Parameters] = M.readlist('hex:8, hex:8, bits')

Parameters作为BitStream('0x0102abcd')

答案 1 :(得分:0)

OCaml通过bitstring camlp4扩展程序:https://code.google.com/p/bitstring/

  let bits = Bitstring.bitstring_of_file "image.gif" in
  bitmatch bits with
  | { ("GIF87a"|"GIF89a") : 6*8 : string; (* GIF magic. *)
      width : 16 : littleendian;
      height : 16 : littleendian } ->
      printf "%s: GIF image is %d x %d pixels" filename width height
  | { _ } ->
      eprintf "%s: Not a GIF image\n" filename

另一个OCaml库不是面向位的,但允许映射C值为cstructhttps://github.com/mirage/ocaml-cstruct

这使您可以编写内联代码,例如:

cstruct pcap_header {
  uint32_t magic_number;   (* magic number *)
  uint16_t version_major;  (* major version number *)
  uint16_t version_minor;  (* minor version number *)
  uint32_t thiszone;       (* GMT to local correction *)
  uint32_t sigfigs;        (* accuracy of timestamps *)
  uint32_t snaplen;        (* max length of captured packets, in octets *)
  uint32_t network         (* data link type *)
} as little_endian

(有关更多信息,请参阅两个项目的自述文件)

答案 2 :(得分:0)

C当然具有相对未知的位域特征。 http://en.m.wikipedia.org/wiki/Bit_field

答案 3 :(得分:0)

除了已经提到的(Ocaml,Erlang,Python,C)之外,我至少还包括Racket [1],SmallTalk / Squeak [2],JavaScript [3],Elixr [4](我意识到这是在Erlang BEAM VM,但我没有看到它)和Haskell [5]

Gustafsson和Sagonas撰写的论文“ Erlang中的BitStream编程的应用,实现和性能评估” [6]有一小段(共3页)标题为“实施”,涵盖了有关实现此系统以及有效抽象的详细信息,因此您可以轻松地将其引入一种新语言。

1:https://docs.racket-lang.org/bitsyntax/index.html

2:https://eighty-twenty.org/2020/10/07/bit-syntax-for-smalltalk

3:https://github.com/squaremo/bitsyntax-js

4:https://gist.github.com/matthewphilyaw/7898f6cb6444246756cd

5:https://hackage.haskell.org/package/BitSyntax-0.3.2.1/docs/Data-BitSyntax.html

6:https://www.it.uu.se/research/group/hipe/papers/padl07.pdf

答案 4 :(得分:-1)

为什么你说它没有价值?

1> M = <<1, 4, 1, 2, 16#abcd:16>>.                       
<<1,4,1,2,171,205>>
2> <<Command:8,Length:8,Parameters/bitstring>> = M.      
<<1,4,1,2,171,205>>
3> <<Bit:1,Nible:4,Byte:8,Rest/bitstring>> = Parameters.
<<1,2,171,205>>
4> Bit.                                                 
0
5> Nible.                                               
0
6> Byte.                                                
32
7> Rest.                                                
<<85,121,5:3>>
8>