Более элегантный способ конвертировать 4 байта в 32-битное целое - PullRequest
0 голосов
/ 04 декабря 2018

Я конвертирую массивы, состоящие из четырех байтовых значений, в 32-битные числа, выполняя следующий код:

a = [0, 16, 82, 0]
i = a.map { |e| "%02x" % e }.join.to_i(16)
# => 1069568

Это работает, как задумано, но мне интересно, есть ли более элегантный способ выполнить эту задачу.Может быть, не использовать строки.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Использование pack и unpack1:

a = [0, 16, 82, 0]

a.pack('C4').unpack1('L>')
#=> 1069568

C4 означает 8-битовое без знака (4 раза) и L> означает32-разрядный без знака (с прямым порядком байтов).

Однако pack возвращает двоичную строку, поэтому она не свободна от строки.

0 голосов
/ 04 декабря 2018

Если у вас есть один байт, результат будет таким, как есть.Если вы добавите один байт в правую часть, это приведет к тому, что исходный результат переместится на две позиции влево (что означает умножение на 0x100 или 16 ** 2 = 256), и добавит новый байт.Вы можете повторить это столько раз, сколько есть байтов.

a.inject{|acc, byte| acc * 0x100 + byte}
# => 1069568
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...