заполнение нулями в TCL - PullRequest
       74

заполнение нулями в TCL

0 голосов
/ 12 февраля 2020

Мой код tcl выглядит следующим образом:

set writes 1a8000028020900

binary scan [binary format H* $writes] B* bits
puts "$bits"

Вывод:

0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

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

Если число отформатированных цифр не заканчивается на границе байта, оставшиеся биты последнего байта будут равны нулю. Как избежать этого заполнения ?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Если число отформатированных цифр не заканчивается на границе байта, оставшиеся биты последнего байта будут равны нулю. Как избежать этого заполнения?

Что ж, вам придется вычислить и сообщить binary scan целевое число битов. Может быть, есть более элегантный способ, чем этот, но почему бы не просто DIY?

% set writes 1a8000028020900
1a8000028020900
% set hexLength [string length $writes]
15
% binary scan [binary format H* $writes] B[expr {$hexLength * 4}] bits
1
% puts $bits
000110101000000000000000000000101000000000100000100100000000
0 голосов
/ 13 февраля 2020

Вот мысль о дополнении исходной строки:

binary scan [binary format H* $writes] B* bits
puts "$bits"

binary scan [binary format H* [format "%016s" $writes]] B* bits
puts "$bits"

output

0001101010000000000000000000001010000000001000001001000000000000
0000000110101000000000000000000000101000000000100000100100000000
0 голосов
/ 12 февраля 2020

На странице manual написано:

Если в arg меньше цифр подсчета, то для оставшихся цифр будут использоваться нули.

Указанное вами значение не указывает все 64 бита. Команда binary не может угадать, что вы хотите, и добавляет нули к концу предоставленной строки.

Редактировать:

Чтобы избежать этого, просто определите все биты в значении, которое должно быть преобразовано:

set writes 01a8000028020900
...