Ruby中的二进制字符串,具有用于布尔表示的单位

Ruby中的二进制字符串,具有用于布尔表示的单位,ruby,udp,bit-manipulation,pack,Ruby,Udp,Bit Manipulation,Pack,我正在考虑根据一个协议构造一个UDP数据包,该协议将数据包的布局指定为位级别,我不确定如何在Ruby中实现这一点。我的理解是数组的pack和unpack函数最合适 数组文档列出了一大堆可以与pack一起使用的不同参数,但我不确定如何将布尔值打包为单个位 我试图实现的格式是这样的 我的理解是,我将能够做如下事情: [size_int, origin_as_int, tagged, addressable, protocol_int, source_int].pack "v1????V1" 其

我正在考虑根据一个协议构造一个UDP数据包,该协议将数据包的布局指定为位级别,我不确定如何在Ruby中实现这一点。我的理解是数组的
pack
unpack
函数最合适

数组文档列出了一大堆可以与
pack
一起使用的不同参数,但我不确定如何将布尔值打包为单个位

我试图实现的格式是这样的

我的理解是,我将能够做如下事情:

[size_int, origin_as_int, tagged, addressable, protocol_int, source_int].pack "v1????V1"
其中问号表示我不确定如何表示字段的位置。我可以做类似的事情

binary_string = ""
binary_string += "%02b" % origin_as_int
binary_string += (tagged ? "1" : "0")
binary_string += (addressable ? "1" : "0")
binary_string += "%012b" % protocol_int

munged_stuff = binary_string.to_i(2)
[size_int, munged_stuff, source_int].pack "v2V1"

我想是吧?不过感觉有点糟糕

我从未使用过引起头痛的方法,但在阅读了他们的文档之后,它们实际上看起来非常简单,至少我认为是更常用的指令,如
'C'
'S'
'L'
'Q'
'B'
'B'
,等等,
'A'
'A'

我相信你可以这样做:

size_int      = 123             # C (0 to 2**8-1 => 255)
origin_as_int = "10"            # B2
tagged        = "1"             # B1
addressable   = "0"             # B1
protocol_int  = "010011001011"  # B12  
source_int    = 2361            # S (0 to 2**16-1 => 65535)

template = %| C B2 B1 B1 B12 S |.delete(' ')
  #=> "CB2B1B1B12S"

s = [size_int, origin_as_int, tagged, addressable, protocol_int,
     source_int].pack(template)
  #=> "{\x80\x80\x00L\xB09\t"

s.unpack(template)
  #=> [123, "10", "1", "0", "010011001011", 2361] 

请编辑您的问题,以包括您迄今为止的代码。类似于我的问题,但更优雅,谢谢