Расшифруйте сообщение, закодированное в шестнадцатеричном формате, с помощью Forth
Я пытался преобразовать сообщение, закодированное в шестнадцатеричном, в Forth. Следующие три слова вышли. Это работает, но кажется уродливым и излишне сложным.
Кроме того, это не является реальным решением, так как я хотел сохранить результат в другой строке для дальнейших манипуляций (и не печатать на экране, как сейчас), но я не знаю, как добавить число (представляющее символ) по адресу...
Итак, как вы думаете, это должно быть сделано, даже с очень длинными сообщениями? Какой самый лучший способ?
\ This work on Gforth 0.7.3
: print ( addr u -- ) hex evaluate decimal emit ;
\ s" 48" print -> H
: hex-decode-char ( addr u n -- ) >r drop r> 2 * + 2 print ;
\ s" 48656C6C6F20776F726C6421" 0 hex-decode-char -> H
: hex-decode-string ( addr u -- ) 2dup dup 2 / 0 ?do i hex-decode-char 2dup loop 2drop 2drop ;
\ s" 48656C6C6F20776F726C6421" hex-decode-string -> Hello world!
1 ответ
Многоразовый блок для решения проблемы decode-hex-string ( a1 u1 a2 u2 -- a2 u )
слово, которое преобразует строку ( a1 u1 )
в буфер ( a2 u2 )
и возвращает строку (или двоичные данные в общем случае) ( a2 u )
, На самом деле строка и буфер почти одинаковы: строка - это буфер, содержащий текстовые данные. Также мы предполагаем, что размер символа и размер адресной единицы равен 1 байту.
: b! c! ; \ store byte in case of 1 char size is 1 bite
: s-to-n ( addr u base -- x ) \ convert string into number with the given radix
base @ >r base !
0. 2swap >number ( d a2 u2 )
r> base !
nip or if -11 throw then
;
: hex-to-number ( a1 u1 -- x ) 16 s-to-n ;
: decode-hex-string ( a1 u1 a2 u2 -- a2 u )
rot 2/ umin 2dup 2>r ( a1 a2 u )
over + swap ?do dup 2 hex-to-number i b! 2 + loop drop 2r>
;
\ test
s" 48656C6C6F20776F726C6421" here 100 decode-hex-string cr type cr