0

Forth で、16 進数でエンコードされたメッセージを変換しようとしていました。次の3つの言葉が出てきました。動作しますが、見苦しく、不必要に複雑に見えます。

また、これは実際の解決策ではありません。結果をさらに操作するために別の文字列に保存したかったためです(現在のように画面に入力するのではなく)が、数値を追加する方法がわかりません(文字を表す) ) アドレスに...

では、非常に長いメッセージであっても、これをどのように行う必要があると思いますか? 最善の方法は何ですか?

\ 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!
4

1 に答える 1

1

与えられた問題の再利用可能な単位は、文字列をバッファdecode-hex-string ( a1 u1 a2 u2 -- a2 u )に変換し、文字列 (または一般的な場合はバイナリ データ) を返す単語です。実際には、string と buffer はほとんど同じです。string は、テキスト データを含むバッファーです。また、char サイズとアドレス単位のサイズは 1 バイトと仮定します。( a1 u1 )( a2 u2 )( a2 u )

: 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
于 2018-02-16T13:26:05.510 に答える