2015-09-21 8 views
1

Я ищу создание UDP-пакета в соответствии с протоколом, который указывает макет пакета на бит-уровень, и я не уверен, как это сделать в Ruby , Мое понимание - это функции pack и unpack для массивов.BinaryString в Ruby с единственным битом для представления bool

http://ruby-doc.org/core-2.2.0/Array.html#method-i-pack

документация массив перечисляет целую кучу различных аргументов, которые могут быть использованы с pack, но я не знаю, как упаковать логическое значение в качестве одного бита.

1

Формат Я пытаюсь добиться, как выглядит это.

Мое понимание было то, что я мог бы сделать что-то вроде:

[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" 

Я полагаю? Чувствует себя плохо.

+0

Пожалуйста, измените вопрос, чтобы включить код, который вы имеете до сих пор. –

ответ

2

Я никогда не использовал головную боль индуцирующей методы Array#pack и 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] 
+0

Подобно тому, что у меня было, но гораздо более элегантным, спасибо – dave