?- sha_hash('howdy', X , []),
atom_codes(Y, X),
maplist(\I^format('~16R',[I]),X).
вывод
EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.
Но, конечно, верхняя строка неоднозначна ...
В качестве альтернативы, заполнение «вручную» может быть выполнено таким образом (всего 1 код здесь)
?- phrase(xinteger(3), L, []),
(L =[A] -> N = [48,A] ; N = L),
format('~s',[N]).
output
03
L = [51],
A = 51,
N = [48, 51] .
xinteger // 1 требует, чтобы это включало :- [library(http/dcg_basics)].
edit : Я нашел строку спецификации дляpadding:
?- format('~`0t~16R~2|', [15]).
0F
true.
, теперь можно написать оригинальный пример
?- sha_hash('howdy', X , []),
atom_codes(Y, X),
maplist(\I^format('~`0t~16R~2|',[I]),X).
, и это выдает
EF42BAB1191DA272F13935F78C401E3DE0C11AFB
X = [239, 66, 186, 177, 25, 29, 162, 114, 241|...],
Y = 'ïBº±\031\\035\¢rñ95÷\214\@\036\=àÁ\032\û'.
, вывод легко может быть захвачен с помощью with_output_to
atom_to_hex(Atom, Hex) :-
atom_codes(Atom, Codes),
with_output_to(Hex, maplist(\I^format('~`0t~16R~2|',[I]), Codes)).
Во всех этих примерах используется library (lambda) .