4

私は、ある種の COMMAND|LENGTH|PARAMETERS 構造を使用して情報を交換する「バイナリ」プロトコルをよく扱います。ここで、PARAMETERS は任意の数の TAG|LENGTH|VALUE タプルです。Erlang は、次のようなパターン マッチングを使用して、メッセージ内の値を簡単に抽出します。

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

M ビット文字列 (COMMAND|LENGTH|PARAMETERS 形式に従うメッセージ) を使用すると、Erlang パターン マッチングを利用して、コマンド、長さ、パラメーターを抽出できます。

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

「bit-nibble-byte」指向のプロトコルを管理するために、これは非常に貴重です!

アドオン ライブラリを介しても、このような構文をサポートする言語は他にありますか?

4

5 に答える 5

4

https://pypi.python.org/pypi/bitstring/3.1.3 for python のようなものを使用すると、これと同じレベルで多くの作業を行うことができます。

あなたの例から:

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

Parametersとして与えますBitStream('0x0102abcd')

于 2014-07-20T16:27:16.053 に答える
0

OCaml は、bitstringcamlp4 拡張を介して行います: 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

それほどビット指向ではありませんが、C 値のマッピングを許可する別の OCaml ライブラリは次のとおりです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

(詳細については、両方のプロジェクトの README を参照してください)

于 2014-07-21T12:59:03.020 に答える
0

もちろん、Cにはビットフィールドの比較的知られていない機能があります。http://en.m.wikipedia.org/wiki/Bit_field

于 2014-07-29T10:18:16.883 に答える