точные значения карты строк tcl - PullRequest
0 голосов
/ 30 мая 2019

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

Hello %user and %user2

Я хочу заменить% user и% user2 на заполненную переменную, в данном случае, Willma и Fred.

Где я использую теги% user и% user2, которые оба представляют одинаковые шестнадцатеричные значения, которые оба заменяются на "Willma". Как я могу точный заменить на набор шестнадцатеричных символов?

Код, который я использую:

set example "48656c6c6f20257573657220616e6420257573657232" ;# Hello %user and %user2 converted to hex
set modify [list "2575736572" "Willma"] ;#replace the tagSymbol as defined from the single entry %user1 | %user2
set hexData [string map $modify $example] ;#preform the swap

% user это 2575736572 в шестнадцатеричном виде. 32 - шестнадцатеричное значение для числа 2. Следующая шестнадцатеричная строка становится 257573657232

Однако, когда я преформирую карту строк, она поменяется местами % user2 оставляя 32 согласно дизайну.Однако это не то, что я хочу.Ниже то, что я ищу.

Окончательный результат:

48656c6c6f20Willma20616e6420Willma32 

, когда я бы хотел, чтобы это было

48656c6c6f20Willma20616e6420257573657232

Как бы я сделал точный обмен?спасибо

1 Ответ

1 голос
/ 30 мая 2019

Порядок подстановок на карте string map имеет значение. В частности, в каждой позиции символа он выполняет сначала преобразование на карте, а затем не применяет никаких дальнейших преобразований в этой точке. Это означает, что %user2 маскируется %user, если не идет первым. (В общем, если вы хотите вычислить автоматический порядок, просто отсортируйте все значения from по длине, сначала по длине. Tcl не делает этого за вас. В большинстве случаев, когда string map либо эффект маскировки не имеет значения, либо сортировка на уровне исходного кода является жизнеспособной.)

set example "48656c6c6f20257573657220616e6420257573657232"
set modify {}
lappend modify [binary encode hex "%user2"] "Fred"
lappend modify [binary encode hex "%user"] "Willma"
set hexData [string map $modify $example]
# ==> 48656c6c6f20Willma20616e6420Fred

Обратите внимание, что я использовал binary encode hex там. Это особенность Tcl 8.6; если вы используете более старый Tcl, вам нужна эта маленькая вспомогательная процедура:

proc HexOf {str} {
    binary scan $str H* hexdigits
    return $hexdigits
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...