Ruby 中的 BinaryString,具有用于 bool 表示的单个位
BinaryString in Ruby with single bit for bool representation
我正在考虑根据将数据包布局指定为位级别的协议构建 UDP 数据包,但我不确定如何在 Ruby 中进行此操作。我的理解是数组的 pack
和 unpack
函数是最合适的。
http://ruby-doc.org/core-2.2.0/Array.html#method-i-pack
数组文档列出了一大堆可以与 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"
我想?不过,感觉有点糟糕。
我从来没有使用过令人头疼的方法 Array#pack and String#unpack,但在阅读了他们的文档之后,它们实际上看起来非常简单,至少对于我认为是更常用的指令,例如 '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]
我正在考虑根据将数据包布局指定为位级别的协议构建 UDP 数据包,但我不确定如何在 Ruby 中进行此操作。我的理解是数组的 pack
和 unpack
函数是最合适的。
http://ruby-doc.org/core-2.2.0/Array.html#method-i-pack
数组文档列出了一大堆可以与 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"
我想?不过,感觉有点糟糕。
我从来没有使用过令人头疼的方法 Array#pack and String#unpack,但在阅读了他们的文档之后,它们实际上看起来非常简单,至少对于我认为是更常用的指令,例如 '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]