我经常处理"二进制"使用某种类型的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协议,这是非常宝贵的!
是否有任何其他语言接近支持这样的语法,即使是通过附加库?
答案 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值为cstruct
:https://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>